在.NET中,为什么常量在编译时而不是在JIT时进行评估?

Jim*_*hel 13 .net c# const

今天,当我在静态类中更改公开可见常量的值,然后用新编译的版本替换了程序集的旧副本时,我有点意外.令人惊讶的是,引用程序集的现有程序没有获取常量的新值.也就是说,我没有重新编译可执行文件,而只是替换了那个程序集.

我的实验的完整描述是如何常数是常数?

我承认对这种行为感到非常惊讶.我明白发生了什么,但我不明白为什么.是否有一个特殊的技术原因导致常量不能在JIT时间而不是编译时间被选中?是否存在这样做会破坏事情的情况?

Eri*_*ert 30

常量应该是常数.对于所有的时间.常数是像pi的值,或者在铅原子中的质子数.

如果你的不断变化,它实际上并不是一个常数 ; 请改用只读字段.

另请参阅框架设计指南,其中指出:

对永远不会改变的常量使用常量字段.编译器将const字段的值直接烧录到调用代码中.因此,如果没有破坏兼容性的风险,永远不能更改const值.

本质上,更改常量而不重新编译依赖于它的所有内容,就像更改方法的签名而不重新编译依赖于它的所有内容一样.编译器在编译依赖程序集时,会从引用的程序集中"加入"有关元数据信息的各种假设.如果你做了任何改变,你不能指望事情只是继续工作.

  • @ChaosPandion:在一个六边形是圆圈的世界里,当然. (16认同)
  • 我听说PI现在正好是3. (7认同)
  • @Jim:我不知道.首先,有一个很好的半打或更多的JIT编译器,我不是他们的专家.其次,JIT编译器经常根据运行时发生的事情改变行为,比如是否附加了调试器.第三,如果您担心性能,请双向编写代码,运行代码,看看是否可以测量差异.如果差异太小而无法衡量,那么你可能首先应该担心的不一样. (5认同)
  • @ChaosPandion - 我被告知总是拥有较小的PI是更健康的,而且我不得不承认,我的周长太大了 - 但是我坚持使用原版,无论多么不合理 (5认同)