QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

解决 C# 7.2 中的结构体性能问题

  • 2018-08-03
  • 本文字数:653 字

    阅读完需:约 2 分钟

在某些使用了 readonly 关键字的情况下,C#编译器会创建出结构体的防御副本。虽然这个问题已经众所周知并被记录下来了,但仍然值得重新审视,因为它与C# 7.2 的几个特性有关。in 和ref readonly 关键字的使用让这个问题出现得更频繁,而readonly 结构体提供了一种解决方法。

C#中的结构体通常用于提升性能,减少用于分配和销毁内存的开销。然而,潜在的陷阱限制了它们的使用。C# 7.2 增加了一个改进的 readonly 结构体来解决这个问题。

在如下几种情况下,C#编译器将为结构体创建副本:

  • 结构体不是只读的。

  • 机构提变量使用了 readonly 修饰符。

  • 调用方法(包括属性)。

复制代码
public struct SomeStruct
{
private int _x;
 
public int X { get { return _x; } }
}
 
private readonly SomeStruct s = new SomeStruct(42);
 
s.X; // 编译器创建了一个防御副本。

当 x 是 in 参数、ref readonly 局部变量或通过 readonly reference 返回值的方法调用的结果时,适用相同的规则。

复制代码
public void BadFunction(in SomeStruct s)
{
s.X; // 编译器创建了一个防御副本。
}

C# 7.2 增加了声明 readonly 结构体的可能性,并提供了避免创建防御副本的解决方案。声明为 readonly 的结构体不能具有属性设置器,并且不能对结构体成员赋值。

我们可以通过静态分析来检测防御性副本问题。 ErrorProne.NET 的灵感来自于 ErrorProne,一个 Java 静态分析工具。移植到.NET 的版本由一组 Roslyn 分析器组成,侧重于准确性和性能。其中有一部分分析器适用于结构体,以Nuget 包的方式供下载使用。

查看英文原文 Performance of Structs in C# 7.2

2018-08-03 09:121818
用户头像

发布了 731 篇内容, 共 454.5 次阅读, 收获喜欢 2003 次。

关注

评论

发布
暂无评论
发现更多内容

探索强化学习(人工智能重要子领域):原理、算法及应用

天津汇柏科技有限公司

人工智能 机器学习 强化学习

限时优惠| 性能测试进阶训练营重磅来袭

测吧(北京)科技有限公司

测试

斩获 CVPR NTIRE 冠亚军,小红书如何提升短视频与直播体验质量?

小红书技术REDtech

人工智能 算法 计算机视觉 音视频 CVPR

LeetCode题解:63. 不同路径 II,动态规划(空间O(n)),JavaScript,详细注释

Lee Chen

视觉特效软件包FxFactory 8 Pro完美破解版 附fxfactory 破解补丁

Rose

淘宝商品详情API接口:轻松管理商品信息,提升运营效率

技术冰糖葫芦

API Explorer API 测试 API 策略 pinduoduo API

ShineScrum捷行公开课

ShineScrum

mac思维导图软件OmniGraffle v7.23中文正式版

Rose

盘点下常见 HDFS JournalNode 异常的问题原因和修复方法

明哥的IT随笔

全套音频插件包FabFilter Total Bundle 2024 mac下载安装

Rose

从面试无力感,到一天2个offer的经验分享(内附大厂面试题)

测试人

面试 软件测试

2024下半年小间距LED市场分析

Dylan

综艺节目 场景 城市 LED display LED显示屏

接口测试:使用 curl 发送请求

测吧(北京)科技有限公司

测试

测试人生 | 招聘严峻期从面试无力感,到一天2个offer的一些经验分享(内附美团、字节、快手等面试题)

测吧(北京)科技有限公司

测试

GPT-4o API 实测解析:开发者的福音还是挑战?

蓉蓉

gpt4o

Three-Body Technology Raindrop & Blade三体声音科技-落英中国扬琴音源

Rose

Royal TSX v6.1激活版 macOS强大的远程管理软件

Rose

直播预约丨《袋鼠云大数据实操指南》No.3:数据资产管理实操,如何有效进行数据治理

袋鼠云数栈

数据中台 数据治理 数据资产 数据湖治理中心 数据资产管理

百度&YY设计稿转代码的探索与实践

百度Geek说

前端 figma 企业号 6 月 PK 榜 设计稿转代码

华为造车究竟成没成功,这个责任谁来担?

IPD产品研发管理

华为 项目管理 产品设计 产品开发 造车

记录一个因 MYSQL 服务端和JDBC驱动版本不一致导致 HMS 启动失败问题

明哥的IT随笔

From IPQ5332 to IPQ9554: Interpret the Wi-Fi 7 chip for different positioning

wifi6-yiyi

cpu wifi technology

Media Encoder 2024 for Mac(ME2024)v24.5激活版

Rose

解决C# 7.2中的结构体性能问题_.NET_Pierre-Luc Maheu_InfoQ精选文章