编译时间’const’是什么意思?

他们说readonly和const之间的区别在于const是编译时(而readonly是运行时)。 但究竟是什么意思,这是编译时间的事实? 一切都被编译成字节码不是吗?

它只是意味着在编译期间标记为const的成员的每个实例都将替换为其值,而readonly成员将在运行时解析。

这意味着const变量被写入它们被引用的位置。 所以,假设你有一个2库,一个带有const变量:

 // Library A const int TEST = 1; // Library B void m () { Console.WriteLine(A.TEST); } 

该变量实际上是在编译时写入B.不同的是,如果重新编译A而不是 B,则B将具有“旧”值。 readonly变量不会发生这种情况。

虽然Julio提供的答案从将变量设置为常量或只读的效果有效,但两个声明之间存在很大差异。

虽然许多人只是简单地说明了在编译中解析常量的值,而只读值只能在运行时解析,但主要点在于引用是在哪里进行的。

根据常量的数据类型,它将在命令唤醒时替换,或者存储在HEAP并由指针引用。

例如,代码:

 const int x = 3; int y = 3 * x; 

可以在编译时解决,只需:

 int y = 3 * 3; 

另一方面,只读字段总是存储在STACK并由指针引用。

const只能在声明期间定义。 readonly可以在声明期间或构造函数中定义。 因此, readonly变量可以根据用于初始化它的构造函数具有不同的值。

通常,“编译时常量”指的是编译器将解析的常量字面值。 编译器生成的代码将constnat值作为立即操作数,而不必从内存加载它。

const编译时的一个结果是,一个程序集中const的更改不会被其他程序集自动拾取而不重新编译它们。

例如:

  1. 程序集A的公共const为int = 10
  2. 程序集B指的是const。
  3. 两个编译。 现在Assembly A const更改为20,重新部署。
  4. 程序集B未重新编译。

在运行时,程序集B认为const的值仍然是10,而不是20。

如果它是只读的,它将获取新值。