我们知道很多关于常数的事情:
除了常数的基本特征之外,为什么clr团队决定用文字替换每一个常数值?在我看来,抖动完全能够将包含程序集加载到内存中,搜索元数据中的类型并提取正确和最新的值。
我真的不相信这里的性能是一个问题,任何代码都没有那么多常量值得。更不用说包含常量的程序集的经典版本控制问题了。
通过C#的CLR应该给我一个过分的回答,但它没有。
答案 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,则不会出现此问题。
希望这有帮助,