顺晟科技
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数据包。
08
1972-02
21
2022-04
05
2022-03
29
2021-08
29
2021-08
29
2021-08