今天我在构造函数中创建了一个默认参数值。
public SomeClass (String something = String.Empty)
{
// ...
}
编译器抱怨道。
“something”的默认参数值必须是编译时 恒定。
我的印象是String类上的Empty是编译时常量。
.field public static initonly string Empty
我是否理解编译时常量的含义,还是我需要接受的更为古怪?
答案 0 :(得分:4)
this已接受答案SO问题为什么String.Empty不是常量?是:
使用静态只读而不是const的原因是由于使用了非托管代码,如Microsoft在共享源公共语言基础结构2.0版本中所示。要查看的文件是sscli20 \ clr \ src \ bcl \ system \ string.cs。
Empty常量保存空字符串值。我们需要调用String构造函数,以便编译器不会将其标记为文字。
将此标记为文字将意味着它不会显示为我们可以从本机访问的字段。
我在CodeProject上从这个方便的article找到了这些信息。
答案 1 :(得分:2)
static readonly
字段不是编译时常量。它只是一个静态字段,在完成初始化的类之后不应该改变。
在当前的.net实现中,你甚至可以用反射来改变它,这会导致非常奇怪的行为。
您可以使用""
,而字符串文字是编译时常量。
答案 2 :(得分:1)
readonly
字段是运行时常量。在初始化对象(或类,如果字段为static
)之前,它不会绑定到某个值。
编译时常量是文字(例如""
- 与String.Empty
完全相同),以及标记为const
的任何内容。