AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

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

关注

评论

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

低代码平台技术分享官丨业务流那些事之单据追踪

inBuilder低代码平台

低代码助力企业数字化转型:实现高效应用开发与部署

互联网工科生

低代码 数字化

语音识别技术的应用及优化

数据堂

OP链质押挖矿系统开发源码搭建

l8l259l3365

KDD 2023 | 蚂蚁“优化器三部曲”之 WSAM

AI Infra

人工智能 开发者 算法 优化器 KDD

软件测试|pip命令,你真的会了吗?

霍格沃兹测试开发学社

软件测试|Python神器logging,你真的了解吗?

霍格沃兹测试开发学社

06. 机器学习入门2 - 理解特征和向量

茶桁

人工智能 机器学习 特征向量

软件测试|f-string格式化输出的这些用法,90%的Pythoner不知道

霍格沃兹测试开发学社

天翼云GPU云主机:共享信息技术与虚拟机的完美融合

天翼云开发者社区

云计算 云主机

软件测试|Python高手教你玩转 Excel 自动化

霍格沃兹测试开发学社

软件测试|神操作!用 Python 操作 xmind 绘制思维导图

霍格沃兹测试开发学社

通过Java Record提升代码质量:简洁而健壮的数据对象

树上有只程序猿

java 14 数据类型

FaceFusion:探索无限创意,创造独一无二的面孔融合艺术!

汀丶人工智能

人工智能 深度学习 计算机视觉

FaceFusion:探索无限创意,创造独一无二的面孔融合艺术!

汀丶人工智能

人工智能 深度学习 计算机视觉 图像生成

软件测试|Python删除列表元素的3种方法,你都会吗?

霍格沃兹测试开发学社

【深入MaxCompute】人力家:借助Information Schema合理治理费用

阿里云大数据AI技术

大数据

天翼云云电脑:IAAS基础设施带来的计算革新

天翼云开发者社区

云计算 云电脑

软件测试/测试开发丨App自动化—高级控件交互方法

测试人

Python 程序员 软件测试 自动化测试

从技术角度聊聊2023年怎么入局小游戏赛道?

FN0

小游戏 小游戏开发 小游戏引擎 小游戏运营

软件测试|一篇文章教你SQL与NoSQL、数据库重要概念、SQL的基本语句

霍格沃兹测试开发学社

软件测试|什么是Python函数及名称空间?

霍格沃兹测试开发学社

软件测试|最全的Python for循环和while循环使用介绍

霍格沃兹测试开发学社

X2RTC正式上线!抢先体验已开启

X2Rtc

开源 音视频 RTC

软件测试|教你轻松玩转Python日期时间

霍格沃兹测试开发学社

智慧公厕建设的好处和意义?提高城市形象和吸引力的秘密武器

光明源智慧厕所

智慧厕所 智慧公厕

语音识别技术的挑战与机遇

数据堂

软件测试|教你如何用Python获取昨天今天明天的日期

霍格沃兹测试开发学社

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