为什么c#常量被替换

时间:2016-01-15 00:33:24

标签: c# clr constants

我们知道很多关于常数的事情:

  • 值必须在编译时知道
  • 值永远不能在运行时更改
  • 将它们推入声明程序集元数据
  • 所有出现都由其在IL
  • 中的值代替
  • 他们可能会造成严重的跨装配版本问题
  • 它们不消耗动态内存,因为它们的值在IL代码中被替换
  • 常量只能是原始类型+任何初始化为null的引用类型(MSDN缺少提及此部分)

除了常数的基本特征之外,为什么clr团队决定用文字替换每一个常数值?在我看来,抖动完全能够将包含程序集加载到内存中,搜索元数据中的类型并提取正确和最新的值。

我真的不相信这里的性能是一个问题,任何代码都没有那么多常量值得。更不用说包含常量的程序集的经典版本控制问题了。

通过C#的CLR应该给我一个过分的回答,但它没有。

1 个答案:

答案 0 :(得分:0)

常量有问题,你将其命名为:“所有出现的事件都被其在IL中的值所取代”。

想象一下,您有一个包含两个项目的解决方案,一个用于DAL / Infrastructure的控制台应用程序(项目A)和一个核心DLL(项目B),例如。

在项目B中,您将TaxRate常量定义为值为10的int,并在项目A中引用常量。

您构建(并且IL中的所有常量事件将替换为“10”的值。)并部署应用程序。

稍后,TaxRate更改为15并且您只编译项目B并仅替换现有应用程序中的DLL - 这将起作用,对吗?

是和否。它会起作用,因为你没有错误 - 唯一改变的是int值。但是在你的控制台应用程序中,当你期望得到15值时,你会得到10的值。为什么?因为在第一次构建应用程序时,所有项目都替换了常量值,并且您只替换了Project B DLL而不是项目A.

在这种情况下,如果您更改为public readonly int,则不会出现此问题。

希望这有帮助,