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