写点什么

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

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

关注

评论

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

LeetCode题解:2648. 生成斐波那契数列,迭代+递归,超详细解析

Lee Chen

解锁低成本数据库归档方案,Databend 受邀参加 TiDB 杭州地区交流会精彩回顾

Databend

什么是无代码?无代码开发平台又是什么?

积木链小链

无代码 无代码平台

立足云南,面向“两亚”,翻开普惠算力新篇章

九章云极DataCanvas

薅羊毛了!百万度算力免费申领活动狂欢继续!

九章云极DataCanvas

如果您干不动跨境外贸独立站,可以来看看反向海淘代购模式

tbapi

反向海淘 反向海淘代购系统 逆向海淘代购系统

Java Pom两个模块需要互相引用怎么办

快乐非自愿限量之名

Java Python 前端

鸿蒙开发案例:打地鼠

zhongcx

电子签软件是什么?概念以及主流产品分析

爱吃小舅的鱼

软件

通义灵码知识库问答增强:知识库构建与管理指南

阿里巴巴云原生

阿里云 云原生 通义灵码

程序员提效的 10 个方法,建议收藏

秃头小帅oi

如何成为一名优秀的程序员,进来看看

伤感汤姆布利柏

实时特征框架的生产实践|得物技术

得物技术

flink 性能优化 数据平台 特征框架

通义灵码知识库问答增强:知识库构建与管理指南

阿里云云效

阿里云 云原生 通义灵码

如何解决SD-WAN安全问题?

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

阿里巴巴云原生

阿里云 云原生

知识管理系统是什么?

ServiceDesk_Plus

知识管理系统 知识管理软件

全新HUAWEI MatePad 11.5发布:搭载华为教育中心,做更好的学习神器

最新动态

数据结构 - 散列表,三探之代码实现

不在线第一只蜗牛

数据结构

使用docker搭建ELK分布式日志同步方案

EquatorCoco

Docker 容器

AI 原生时代,更要上云:百度智能云云原生创新实践

百度Geek说

软件测试学习笔记丨Flask框架-接口使用

测试人

flask 软件测试

spring-关于组件的注入及获取流程

快乐非自愿限量之名

Java Spring Boot 后端

从人员外包到测试工具、测试平台,提供全方位的测试解决方案~

霍格沃兹测试开发学社

新技术如何解决体育直播平台开发中的五大难题?

软件开发-梦幻运营部

推特账号被冻结怎么办?检查IP是否正常

Ogcloud

云手机 海外云手机 海外原生IP 海外IP

云原生开源开发者沙龙丨AI 应用工程化专场杭州站邀您参会

阿里巴巴云原生

阿里云 云原生

软件测试学习笔记丨Flask框架-请求与响应

测试人

flask 软件测试

天润融通邀您参加AI破局·聚力增长行业论坛

天润融通

用户增长 AI大模型 用户运营 天润融通

除了邮件钓鱼外,你还知道哪些常见的钓鱼攻击方式?

国科云

如何通过指标驱动研发体系建设

思码逸研发效能

DevOps 研发效能 效能度量 研发效能管理 思码逸

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