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

时间:2010-12-19 23:13:05

标签: c#

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

6 个答案:

答案 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的更改不会被其他程序集自动拾取而不重新编译它们。

例如:

  1. 程序集A的公共const为int = 10
  2. 程序集B指的是那个const。
  3. 两个编译。现在汇编一个const 改为20,重新部署。
  4. 程序集B未重新编译。
  5. 在运行时,程序集B认为const的值仍为10,而不是20。

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