c# 7.2中结构体性能问题的解决方案

  

  

在某些使用了只读的关键字的情况下,c#编译器会创建出结构体的防御副本。虽然这个问题已经众所周知并被记录下来了,但仍然值得重新审视,因为它与c# 7.2的几个特性有关在和裁判只读的关键字的使用让这个问题出现得更频繁,而只读的结构体提供了一种解决方法。

  

c#中的结构体通常用于提升性能,减少用于分配和销毁内存的开销。然而,潜在的陷阱限制了它们的使用C # 7.2增加了一个改进的只读的结构体来解决这个问题。

  

<强>在如下几种情况下,c#编译器将为结构体创建副本:

  
      <李>,结构体不是只读的。   <李>,机构提变量使用了只读的修饰符。   <李>,调用方法(包括属性)。   
        公共struct SomeStruct   {   私人int值;         公共int X{{返回值;}}   }         私人只读的SomeStruct s=新SomeStruct (42);         s.X;//编译器创建了一个防御副本。      

当x是参数,裁判只读的局部变量或通过只读的参考返回值的方法调用的结果时,适用相同的规则。

        公共空间BadFunction(在SomeStruct年代)      {   s.X;//编译器创建了一个防御副本。   }      

c# 7.2增加了声明只读的结构体的可能性,并提供了避免创建防御副本的解决方案。声明为只读的的结构体不能具有属性设置器,并且不能对结构体成员赋值。

  

我们可以通过静态分析来检测防御性副本问题.ErrorProne.NET的灵感来自于ErrorProne,一个Java静态分析工具。移植到。net的版本由一组Roslyn分析器组成,侧重于准确性和性能。其中有一部分分析器适用于结构体,以Nuget包的方式供下载使用。

  

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

  

c# 7.2中结构体性能问题的解决方案