今天我在构造函数中创建了一个默认参数值。
public SomeClass (String something = String.Empty)
{
// ...
}
编译器抱怨。
“某物”的默认参数值必须是编译时常量。
我的印象是 String 类上的 Empty 是一个编译时常量。
.field public static initonly string Empty
我是否误解了编译时常量的含义,还是我需要接受更多古怪?
今天我在构造函数中创建了一个默认参数值。
public SomeClass (String something = String.Empty)
{
// ...
}
编译器抱怨。
“某物”的默认参数值必须是编译时常量。
我的印象是 String 类上的 Empty 是一个编译时常量。
.field public static initonly string Empty
我是否误解了编译时常量的含义,还是我需要接受更多古怪?
这个SO 问题的公认答案为什么 String.Empty 不是常量?是:
使用 static readonly 而不是 const 的原因是与非托管代码一起使用,正如 Microsoft 在 Shared Source Common Language Infrastructure 2.0 Release 中所指出的那样。要查看的文件是 sscli20\clr\src\bcl\system\string.cs。
Empty 常量保存空字符串值。我们需要调用 String 构造函数,以便编译器不会将其标记为文字。
将其标记为文字意味着它不会显示为我们可以从本机访问的字段。
我从CodeProject的这篇方便的文章中找到了这些信息。
static readonly
字段不是编译时常量。它只是一个静态字段,在其完成初始化的类之后不应更改。
在当前的 .net 实现中,您甚至可以通过反射来更改它,这会导致非常奇怪的行为。
您可以改用""
它,它作为字符串文字是编译时间常数。
字段是readonly
运行时常量。static
在初始化对象(或类,如果字段为 )之前,它不会绑定到值。
编译时常量是文字(例如""
- 本质上与 , 相同String.Empty
)和任何标记const
.