编译时间’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的更改不会被其他程序集自动拾取而不重新编译它们。
例如:
- 程序集A的公共const为int = 10
- 程序集B指的是const。
- 两个编译。 现在Assembly A const更改为20,重新部署。
- 程序集B未重新编译。
在运行时,程序集B认为const的值仍然是10,而不是20。
如果它是只读的,它将获取新值。