C# 7.2中结构体性能问题的解决方案
作者:无明 时间:2022-08-12 23:04:26
前言
在某些使用了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包的方式供下载使用。
总结
来源:http://www.infoq.com/cn/news/2018/08/structs-performance-csharp
标签:c#7.2,结构体,性能
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Mono for Android 实现高效的导航(Effective Navigation)
2023-09-05 21:39:56
![](https://img.aspxhome.com/file/2023/0/89520_0s.png)
Android RxJava创建操作符Timer的方法
2022-04-22 13:10:26
Android ViewPager相册横向移动的实现方法
2023-02-19 07:26:08
![](https://img.aspxhome.com/file/2023/6/139436_0s.jpg)
android控件实现多张图片渐变切换
2022-06-18 20:11:57
![](https://img.aspxhome.com/file/2023/9/139409_0s.gif)
Java程序设计之12个经典样例
2022-09-22 18:44:00
@Value如何获取yml和properties配置参数
2021-12-12 13:24:01
![](https://img.aspxhome.com/file/2023/3/76473_0s.png)
c# 图片加密解密的实例代码
2023-08-20 21:21:01
SpringBoot+netty-socketio实现服务器端消息推送
2023-11-15 06:14:31
JDK源码之PriorityQueue解析
2022-05-15 17:17:15
![](https://img.aspxhome.com/file/2023/1/63741_0s.png)
Java动态代理模式的深入揭秘
2023-07-27 23:41:25
![](https://img.aspxhome.com/file/2023/9/113249_0s.jpg)
Java Mybatis框架多表操作与注解开发详解分析
2023-12-04 17:15:14
![](https://img.aspxhome.com/file/2023/6/88746_0s.png)
java如何让带T的时间格式化
2022-12-22 10:44:28
![](https://img.aspxhome.com/file/2023/8/125238_0s.png)
Java调用shell命令涉及管道、重定向时不生效问题及解决
2021-07-18 17:02:25
Android自定义可控制速度的跑马灯
2023-08-11 14:05:00
分析HashMap 的 JDK 源码
2022-01-17 06:29:54
![](https://img.aspxhome.com/file/2023/4/68164_0s.jpg)
java实现最短路径算法之Dijkstra算法
2021-12-28 12:26:06
![](https://img.aspxhome.com/file/2023/3/97973_0s.png)
springBoot接入阿里云oss的实现步骤
2023-05-28 23:09:04
![](https://img.aspxhome.com/file/2023/2/110872_0s.png)
idea中如何使用git进行版本回退详解
2022-03-24 06:28:11
![](https://img.aspxhome.com/file/2023/2/101762_0s.jpg)
java程序设计语言的优势及特点
2022-08-16 09:12:57
详解C#之事件
2022-01-07 22:18:14
![](https://img.aspxhome.com/file/2023/2/85652_0s.png)