博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决C# 7.2中的结构体性能问题
阅读量:7136 次
发布时间:2019-06-28

本文共 832 字,大约阅读时间需要 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,一个Java静态分析工具。移植到.NET的版本由一组Roslyn分析器组成,侧重于准确性和性能。其中有一部分分析器,以Nuget包的方式供下载使用。

\\

查看英文原文

转载地址:http://ncjrl.baihongyu.com/

你可能感兴趣的文章
为什么必须是final的呢?
查看>>
QTableWidget详解(样式、右键菜单、表头塌陷、多选等)
查看>>
Map/Reduce的类体系架构
查看>>
【编程题目】有 4 张红色的牌和 4 张蓝色的牌,主持人先拿任意两张,再分别在 A、B、C 三人额头上贴...
查看>>
Language and Compiler Features Since Delphi 7
查看>>
了解Linux的进程与线程
查看>>
2014技术总结
查看>>
使用 jsoup 对 HTML 文档进行解析和操作
查看>>
Chapter 2 User Authentication, Authorization, and Security(4):限制SA帐户管理权限
查看>>
setSystemUiVisibility() 与 getSystemUiVisibility() 显示隐藏状态栏
查看>>
mongoDB - 安装
查看>>
Unity3d如何profile模拟器
查看>>
把object转成JSONObject JSON.toJSON
查看>>
prtg
查看>>
xp安装maven
查看>>
《Pro ASP.NET MVC 3 Framework》学习笔记之二十二【Controllers和Actions】
查看>>
(转)sscanf函数的用法
查看>>
30个高质量的免费jquery滑块PSD文件
查看>>
hdu1686(kmp)
查看>>
【web前端面试题整理05】做几道前端面试题休息休息吧
查看>>