50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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

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

关注

评论

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

YashanDB知识库|别名和变量同名就报错?这个“重名陷阱”得避开!

数据库砖家

数据库·

YashanDB知识库|用 yasldr 导入 LOB 字段,有几种方式?lls 和 lobfile 怎么选?

数据库砖家

数据库·

电信SD-WAN线路的有那些优势

宽炜网络

电信sd-wan

虚拟云环境中的高性能块设备:直通方法比较

Sergey Platonov

Performance 虚拟化 高性能计算,

哈尔滨等保测评数据隐私与合规风险

黑龙江陆陆信息测评部

iVX:图形化编程语言 + IDE,而非传统 “代码平台”

代码制造者

无代码平台

阶跃星辰发布端到端语音接口 Realtime API,理解情绪、随时打断;Dia TTS:生成语音可带笑声、咳嗽声、清嗓子丨日报

声网

YashanDB 知识库|如何远程连接 YashanDB 数据库?最全工具和方式合集!

数据库砖家

数据库·

YashanDB知识库|集成 Druid 连接池时日志报 “token IDENTIFIER start”?问题虽小但有来头!

数据库砖家

数据库·

炸裂!推荐一款开源项目集成 Dify 到钉钉

柯杰

钉钉 dify

海外加速专线:解锁跨国视频会议,助您畅享畅聊体验

宽炜网络

海外网络专线

《Operating System Concepts》阅读笔记:p764-p766

codists

操作系统

个人开发者如何发送短信?这个方案太香了!

外滩运维专家

短信验证码 短信验证 短信发送 个人短信 短信群发

YashanDB知识库|BeetISQL 批量插入时报 autoAssignKey 异常?可能是 rowid 惹的祸

数据库砖家

数据库·

分析型数据库与事务型数据库?核心差异与选型指南

镜舟科技

OLAP 分析型数据库 OLTP 事务型数据库 数据存储结构

AI在线生成组织架构图!办公效率原地起飞!

职场工具箱

AI 办公软件 AIGC 绘图软件 组织架构图

YashanDB知识库|服务端编码是 GBK,为什么升级失败了?这其实是个字符集对齐问题

数据库砖家

数据库·

YashanDB知识库|Quartz调度写布尔值报错?问题关键在于 true/false 与 0/1 的差异

数据库砖家

数据库·

Arthas monitor(方法执行监控)

刘大猫

Java 监控 Monitor Arthas 方法执行监控

YashanDB知识库|JDBC 和 OCI 驱动需要设置字符集吗?其实你可能多虑了!

数据库砖家

数据库·

最全面的采样器:Native Instruments Maschine 3

Rose

YashanDB|设置了归档日志上限,为什么磁盘还是被打爆了?

数据库砖家

数据库·

BOE(京东方)LTPO技术赋能vivo x200 Ultra 超低功耗解锁专业级影像新体验

爱极客侠

我们收到了数百份AI“生存提案”|72小时AI生存挑战招募中

声网

Easysearch 移除 Master 节点注意事项

极限实验室

数据库·

【参会有礼】4.26 广州 | 国产开源 AI 数据库技术交流

Apache IoTDB

阿维塔或将首批搭载ADS4

科技热闻

TiDB 社区第四届专栏征文大赛联合墨天轮火热开启,TiDB 业务场景实战、运维开发攻略两大赛道,BOSE 降噪耳机、大疆手持云台、投影仪、运动手环、礼品卡等重磅礼品等你来拿!

TiDB 社区干货传送门

数据库 运维 分布式数据库 征文大赛 TiDB

YashanDB知识库|一个 SQL 多个执行计划?绑定参数背后的优化器逻辑别忽略

数据库砖家

数据库·

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