出于某种原因,我一直假设readonly
字段具有与之相关的开销,我认为这是 CLR 跟踪readonly
字段是否已初始化。这里的开销将是一些额外的内存使用来跟踪状态并在分配值时进行检查。
也许我假设这是因为我不知道一个readonly
字段只能在构造函数内或字段声明本身内初始化,并且没有运行时检查,您将无法保证它不会被多次分配方法。但是现在我知道了,C# 编译器可以很容易地对其进行静态检查,对吧?是这样吗?
另一个原因是我读到使用 对readonly
性能有“轻微”影响,但他们从未提出过这种说法,我找不到关于这个主题的信息,因此我提出了问题。我不知道除了运行时检查之外还有什么其他的性能影响。
第三个原因是我看到它readonly
在编译后的 IL 中保留为initonly
,那么如果readonly
C# 编译器保证该字段永远不会分配给构造函数还是声明?
另一方面,我发现您可以通过反射设置 a 的值,而 CLR 不会抛出异常,如果是运行时检查readonly int
,这是不可能的。readonly
所以我的猜测是:“只读”只是一个编译时特性,任何人都可以确认/否认这一点吗?如果是,那么将这些信息包含在 IL 中的原因是什么?