10

今天我在构造函数中创建了一个默认参数值。

public SomeClass (String something = String.Empty)
{
   // ...
}

编译器抱怨。

“某物”的默认参数值必须是编译时常量。

我的印象是 String 类上的 Empty 是一个编译时常量。

.field public static initonly string Empty

我是否误解了编译时常量的含义,还是我需要接受更多古怪?

4

3 回答 3

4

这个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的这篇方便的文章中找到了这些信息。

于 2012-05-30T22:58:11.817 回答
2

static readonly字段不是编译时常量。它只是一个静态字段,在其完成初始化的类之后不应更改。

在当前的 .net 实现中,您甚至可以通过反射来更改它,这会导致非常奇怪的行为。

您可以改用""它,它作为字符串文字是编译时间常数。

于 2012-05-30T22:57:15.877 回答
1

字段是readonly运行时常量。static在初始化对象(或类,如果字段为 )之前,它不会绑定到值。

编译时常量是文字(例如""- 本质上与 , 相同String.Empty)和任何标记const.

于 2012-05-30T22:58:41.913 回答