const与readonly

Che*_*hen 8 .net c# const readonly

今天我发现了一篇文章,其中一个const字段称为编译时常量,而一个readonly字段称为运行时常量.这两个短语来自"Effective C#".我在MSDN和语言规范中搜索,找不到运行时常量.

没有攻击性,但我不认为运行时常量是一个恰当的短语.

private readonly string foo = "bar";
Run Code Online (Sandbox Code Playgroud)

创建一个名为"foo"的变量,其值为"bar",值为readonly,这里它是一个变量,没有业务constant.只读变量仍然是变量,它不能是常量.变量和常量是互斥的.

也许这个问题太过分了,我还是想听听别人的意见.你怎么看?

Tig*_*ran 10

我相信作者的意思如下:

考虑示例:

public class A {

     public const int a = Compute();         

     private static int Compute(){

          /*some computation and return*/ 
          return some_computed_value;
     }
}
Run Code Online (Sandbox Code Playgroud)

这个,不会编译,因为你必须有常量值来分配a.所以这是编译时常量的含义.

相反,如果你改变它

public class A {

     public readonly int a = Compute();          

     private static int Compute(){
          /*some computation and return*/ 
          return some_computed_value;
     }
}
Run Code Online (Sandbox Code Playgroud)

这将编译.它在运行时进行计算并将其分配给a.这是运行时常量的含义

  • @DannyChen:正如其他人指出的那样,我相信这本书正在讨论恒定(不可变)的价值.第一次在编译时变为这样,在第二种情况下变为运行时(在计算之后). (3认同)

Mar*_*ell 6

正如您自己所说,该术语未在语言规范等中使用.责备那本书!我称之为"只读字段",因为它就是这样 - 这里"readonly"的定义与初始化器/构造函数有关,并且仅限于常规代码.例如,即使是只读字段也是可以改变的......

// how to annoy your colleagues...
typeof(string).GetField("Empty").SetValue(null, " ");
Run Code Online (Sandbox Code Playgroud)

(注意,这不再适用于最近的CLR版本 - JIT可能会用ldstr替换字段加载 - 但它确实在很长一段时间内完成了)

(更真实的理由在对象上执行此操作与反序列化有关)

  • @Danny当我说"责备这本书"时,我认为Jon的观点是好的; 也许它只是在使用*描述性*而非*正式*术语时没有说清楚 (3认同)