写点什么

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

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

关注

评论

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

究竟谁更需要已读功能?用户还是即时通讯本身?

BeeWorks

自定义spring boot starter三部曲之二:实战开发

程序员欣宸

Java springboot 7月月更

【开课预告】7~9月学习课程《基于MASA Framework的EShop实战》

MASA技术团队

移动互联网未来发展的五大趋势

BeeWorks

SAP Fiori 应用 Adapt UI 动态显示或者隐藏的技术设计细节解析

汪子熙

JavaScript 前端开发 web开发 SAP 7月月更

开发实践丨昇腾CANN的推理应用开发体验

华为云开发者联盟

Python 人工智能

裴丹:AIOps 智能运维经验分享

华为云开发者联盟

云计算 后端

企事业单位建设知识管理的七条建议

Baklib

知识管理 企事业单位

SaaS应用:实现企业数字化转型的最佳途径

Baklib

在武汉学习web前端开发课程哪家比较好

小谷哥

在线SQL转JSON工具

入门小站

工具

WorkPlus SE | 全国第1个永久免费的即时通讯软件!

BeeWorks

混合办公-疫情之下,远程办公靠谱吗?

BeeWorks

实践丨手把手教你用STM32设计WiFi语音播报日程表

华为云开发者联盟

开发

web前端开发技术前景怎么样好不好

小谷哥

ST 端侧人工智能之视觉检测课程

贾献华

7月月更

2022年智能运维企业50强,博睿数据实力入选

博睿数据

数字化 智能运维 博睿数据 性能监测

灵雀云加入LF机密计算联盟,推进机密计算在云原生场景的应用

York

灵雀云 云原生 机密计算

自动化测试如何实施落地?

老张

软件测试 自动化测试 项目落地

在线多行文本批量正则替换添加后缀工具

入门小站

工具

# 重要-即时通讯IM开源项目OpenIM关于版本管理及v2.3.0发布计划

Geek_1ef48b

linux远程复制文件命令小总结

入门小站

学习WEB前端去哪里培训比较好

小谷哥

大模型训练难于上青天?效率超群、易用的“李白”模型库来了

OneFlow

机器学习 gpu 模型训练

Free自由协议系统Dapp开发(锁仓复利)

薇電13242772558

智能合约 dapp

如何深入学习Html5前端技术知识

小谷哥

SpringBoot的SpringBootApplication注解

技术小生

springboot 7月月更

在上海想学web前端课程如何选择

小谷哥

Optional的使用详解

echoes

C 语言入门(五)

逝缘~

7月月更

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