18910140161

解决C# 7.2的结构性能问题

顺晟科技

2021-08-28 09:39:56

42

在某些使用Readonly关键字的情况下,C#编译器会创建结构的防御副本。这个问题已经众所周知,但与C# 7.2的一些特性有关,因此值得重新考虑。使用In和ref readonly关键字时,此问题更经常发生,readonly结构提供解决方案。

C#的结构通常用于提高性能,减少用于分配和销毁内存的开销。但是潜在的陷阱限制了使用。C# 7.2添加了改进的readonly结构来解决此问题。

在以下情况下,C#编译器会创建结构的副本:

结构不是只读的。

机构提升变量使用readonly修改器。

方法(包括属性)。

复制代码

Public struct SomeStruct

{

private int _ x;

公共int x { get { return _ x}}

}

private readonly some struct s=new some struct(42);

S.x;//编译器制作了防御副本。

如果x是通过in参数、ref readonly本地变量或readonly reference返回值的方法调用的结果,则同样的规则也适用。

复制代码

public void bad function(inso mestructs)

{

S.x;//编译器制作了防御副本。

}

C# 7.2提供了一种解决方案,可以提高声明readonly结构的可能性,并防止创建防御副本。声明为Readonly的核心不能具有属性设置器,并且不能为核心成员指定值。

静态分析可以检测防御副本问题。ErrorProne。NET灵感来自Java静态分析工具ErrorProne。迁移到NET的版本由一组专注于准确性和性能的Roslyn分析器组成。其中一些分析器适用于结构,可以下载为Nuget数据包。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航