gpt4 book ai didi

c# - 为什么要替换 c# 常量

转载 作者:太空宇宙 更新时间:2023-11-03 15:27:17 25 4
gpt4 key购买 nike

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

  • 值必须在编译时已知
  • 值永远不能在运行时改变
  • 它们被压入声明程序集的元数据中
  • 所有的出现都被它在 IL 中的值所取代
  • 它们可能会造成严重的交叉汇编版本控制问题
  • 它们不消耗动态内存,因为它们的值在 IL 代码中被替换
  • 常量只能是原始类型+任何初始化为null的引用类型(MSDN没有提到这部分)

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

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

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

最佳答案

常量有一个问题,你给它起了个名字:“所有出现的地方都被它在 IL 中的值所取代”。

假设您有一个包含两个项目的解决方案,一个控制台应用程序(项目 A)和一个用于 DAL/基础结构的核心 DLL(项目 B),例如

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

您构建(在 IL 中所有常量出现将被值“10”替换。)并部署您的应用程序。

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

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

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

希望对您有所帮助,

关于c# - 为什么要替换 c# 常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34802402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com