写点什么

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

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

关注

评论

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

vivo鲁班RocketMQ平台的消息灰度方案

vivo互联网技术

RocketMQ 消息中间件

设计秒杀系统架构,这4个关键点要注意

华为云开发者联盟

秒杀系统 订单 秒杀系统架构 RabbitMQ延时队列 Rabbit MQ

详解图像处理的算术运算与逻辑运算

华为云开发者联盟

OpenCV 计算机视觉 图像处理 图像算术 逻辑运算

ModStartCMS模块化建站系统 v3.4.0 富文本粘贴上传,自定义分页

ModStart开源

php laravel modstart

业务驱动的全景监控体系在阿里的应用 | 阿里巴巴DevOps实践指南

阿里云云效

云计算 阿里云 DevOps 云原生 云端开发

【CAD】系列Ⅰ

謓泽

3月月更

消息复杂计算的抽象和简化

阿里巴巴终端技术

数据处理 客户端 消息

大咖说|阿里巴巴闻佳:数字技术将引领我们走向节能型社会

大咖说

阿里巴巴 数字化 环保 双碳

国产虚拟化软件H3C CAS体验之环境搭建(虚拟机搭建)

WangNing

虚拟化 环境搭建 H3C CAS

2021年券商APP盘点:用户规模大幅度增长,智能炒股成为行业标配

易观分析

券商

数字化时代,银行如何建设管理小程序平台促进线上金融业务发展?

FinClip

小程序 银行

从旁观者到贡献者:经历 OpenYurt 的“开源之夏”,我们想让更多人体验社区的魅力

阿里巴巴云原生

小程序插件提升APP使用体验

Speedoooo

敏捷开发 APP开发 app性能 容器平台 小程序插件

【web安全】Spring boot heapdump获取敏感信息

H

Java 网络安全 WEB安全

“==”和“===”,难道不是多一个的区别吗?

华为云开发者联盟

JavaScript typescript string 变量 操作符

网络协议之:socket协议详解之Datagram Socket

程序那些事

socket 网络协议 udp 程序那些事 3月月更

Tech Talk 活动预告 | 送走 CentOS Linux 8,开发者们该如何保持 Linux 的采用途径?

亚马逊云科技 (Amazon Web Services)

开发者

如何选择最优路径完成云原生上云?听这场阿里云特别分享【云原生技术与最佳实践】

阿里巴巴云原生

Intel CET缓解机制实战解读

腾讯安全云鼎实验室

安全攻防 网络安全 安全研究

释放「数据价值」,请别忽视基础软件本身的提升

ToB行业头条

使用Rust的几点理由,加入我们,一起学习!

非凸科技

网络安全 kali web安全【渗透测试】目录遍历漏洞

学神来啦

网络安全 渗透测试 WEB安全 kali kali Linux

免费机器资源、硬核导师、丰厚奖励|OpenI启智社区联合主办的飞桨黑客马拉松第二期开始啦~

OpenI启智社区

云图说|DRS数据对比——带您随时观测数据一致性

华为云开发者联盟

数据一致性 DRS 数据复制 数据迁移

网易数帆云原生日志平台架构实践

网易数帆

云原生 网易

什么是FAQ?如何编写FAQ文档?

小炮

5G和Wi-Fi市场与技术的一些思考系列之一

李伟-晨泳

C++后台开发学习路线

Linux服务器开发

后台开发 C/C++ 后端开发 Linux服务器开发 C++后台开发

NextRPC : RPC多段返回的创新和探索

阿里巴巴终端技术

RPC 客户端

无缝融入 Kubernetes 生态 | 云原生网关支持 Ingress 资源

阿里巴巴云原生

基于微信小程序的运动场馆预约小程序开发笔记

CC同学

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