他们说readonly和const之间的区别在于const是编译时(而readonly是运行时)。但究竟是什么意思呢,这是编译时间的事实?一切都被编译成字节码不是吗?
答案 0 :(得分:17)
这意味着const变量被写入它们被引用的位置。所以,假设你有一个2个库,一个带有const
变量:
// Library A
const int TEST = 1;
// Library B
void m ()
{
Console.WriteLine(A.TEST);
}
该变量实际上是在编译时写入B.不同的是,如果重新编译A但不是 B,则B将具有“旧”值。 readonly
变量不会发生这种情况。
答案 1 :(得分:12)
它只是意味着标记为const
的成员的每个实例在编译期间都将被其值替换,而readonly成员将在运行时被解析。
答案 2 :(得分:2)
尽管Julio提供的答案从将变量设置为常量或只读的效果有效,但两个声明之间存在很大差异。
虽然很多人只是简单地说明了一个常量的值在编译中得到解决,而只读值只能在运行时解析,但主要点在于引用的位置。
根据常量的数据类型,它将在命令evocation中替换,或者存储在HEAP
中并由指针引用。
例如,代码:
const int x = 3;
int y = 3 * x;
可以在编译时解决,只需:
int y = 3 * 3;
另一方面,只读字段始终存储在STACK
上并由指针引用。
答案 3 :(得分:1)
const 只能在声明期间定义。 readonly 可以在声明期间或构造函数中定义。因此,根据用于初始化它的构造函数, readonly 变量可以具有不同的值。
答案 4 :(得分:1)
通常,“编译时常量”指的是编译器将解析的常量字面值。编译器生成的代码将constnat值作为立即操作数,而不必从内存中加载。
答案 5 :(得分:1)
const编译时的一个结果是,一个程序集中const的更改不会被其他程序集自动拾取而不重新编译它们。
例如:
在运行时,程序集B认为const的值仍为10,而不是20。
如果它是只读的,它会获取新值。