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.这是运行时常量的含义
正如您自己所说,该术语未在语言规范等中使用.责备那本书!我称之为"只读字段",因为它就是这样 - 这里"readonly"的定义与初始化器/构造函数有关,并且仅限于常规代码.例如,即使是只读字段也是可以改变的......
// how to annoy your colleagues...
typeof(string).GetField("Empty").SetValue(null, " ");
Run Code Online (Sandbox Code Playgroud)
(注意,这不再适用于最近的CLR版本 - JIT可能会用ldstr替换字段加载 - 但它确实在很长一段时间内完成了)
(更真实的理由在对象上执行此操作与反序列化有关)