写点什么

解决 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:122276
用户头像

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

关注

评论

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

JAVA权限管理 助力企业精细化运营

力软低代码开发平台

机器学习完整路径

木南曌

机器学习

如何阅读并学习 MegEngine 的代码

MegEngineBot

深度学习 开源框架 MegEngine

全面揭秘:抖音集团 QUIC 千万 QPS 应用实践

火山引擎边缘云

传输协议 QPS QUIC QUIC协议 火山引擎边缘云

软件测试 | web测试-辨别时间格式

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

测试

社交软件源码的核心,IM即时通讯技术

山东布谷网络科技

源码 IM

解构软件开发中的破窗效应

互联网工科生

敏捷开发 软件开发 破窗效应

生成式AI:内容创作的新革命

百度开发者中心

一次网络不通"争吵"引发的思考

阿里巴巴云原生

阿里云 云原生

百度工程师浅析强化学习

百度Geek说

强化学习 ppo 企业号 8 月 PK 榜 RL

Schiaparelli着陆器坠毁事故回溯与思考

DevOps和数字孪生

AntDB数据库受邀参加【ACDU 中国行】,共促行业发展和创新

亚信AntDB数据库

数据库 AntDB AntDB数据库 企业号 8 月 PK 榜

生成式AI:改变生活与工作的未来力量

百度开发者中心

人工智能 文心一言

生成式AI:企业创新与效率的新引擎

百度开发者中心

人工智能 文心一言

EMQX Enterprise 5.1 正式发布:生产环境就绪的 MQTT over QUIC

EMQ映云科技

QUIC 版本更新

无需MAC电脑就可以上传ipa文件到AppStore开发者中心

初雪CIoud

软件测试 | 以编程方式对时间值进行编码

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

测试

生成式AI引领视频制作创新

百度开发者中心

人工智能 视频 文心一言

基础设施SIG月度动态:龙蜥大讲堂 - 基础设施系列专题分享火热进行中(7~8 月上旬持续分享),敬请关注!

OpenAnolis小助手

基础设施 CVE 龙蜥社区 sig T-one

什么是隐私计算?隐私计算技术路线

隐语SecretFlow

大数据 联邦学习 信息安全 数据安全 隐私计算

敏捷、DevOps和嵌入式系统测试

DevOps和数字孪生

DevOps 敏捷工具

软件测试 |web测试—截获和修改POST请求

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

生成式AI:游戏研发的新革命

百度开发者中心

人工智能 文心一言

生成式AI助力中国汽车产业发展

百度开发者中心

人工智能 汽车 文心一言

生成式AI助力开发者创新

百度开发者中心

人工智能 百度文心一言

生成式AI掀起创意革命

百度开发者中心

人工智能 文心一言

生成式AI助力搜索应用创新

百度开发者中心

人工智能 百度文心一言

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