为什么作为引用类型的字符串可以是非空const,而其他引用类型consts必须为null?

时间:2014-07-10 10:43:38

标签: c#

据我所知,string是一种参考类型。 const只有在reference被分配时才能与null类型一起使用。我的问题是

为什么可以为引用类型string分配一个文字字符串(或非空)?

5 个答案:

答案 0 :(得分:12)

取自const文档:

常量表达式是一个可以在编译时完全计算的表达式。因此,引用类型常量的唯一可能值是string和null引用。

换句话说,它是一个例外。如果不存在字符串常量这样的事情,那么生活会变得非常困难。

您还可以记住,它不是所有字符串,例如,您无法使用代码const string test = new string('t', 7);进行编译,即使您可以使用{{1 }}。另一方面,虽然您可以将字符串常量定义为字符串文字(static string test = new string('t', 7);),但您无法使用文字(test = "value";)定义任何其他引用类型。

答案 1 :(得分:4)

这是C#语言中的一项特殊规则,也是CLR的一项功能。编译器知道如何将字符串嵌入到汇编元数据中。

答案 2 :(得分:3)

ECMA-334 C#规范有以下注释(强调我的):

  

如§14.16所述,constant-expression是一个可以在编译时完全评估的表达式。   由于创建除string之外的reference-type的非null值的唯一方法是应用   new运算符,并且因为new-operator不允许使用常量表达式,所以唯一可能的值   对于引用类型的常量类型除了字符串之外是空的。

答案 3 :(得分:2)

根据MSDN

  

常量可以是数字,布尔值,字符串或空引用。

答案 4 :(得分:0)

每个程序集包含一个字节序列,其中包含程序集中定义的所有字符串,并且在加载类型时,系统将使用该序列中的字节创建新的字符串对象列表。在程序集中声明的每个字符串文字都分配了一个索引,并且加载字符串文字的指令从加载该程序集时创建的字符串对象表中读取字符串对象。

对于任何不包含任何嵌套类类型字段的类类型,这种行为都是可能的,但通常只对不可变类类型有用。由于没有通用的方法来区分不可变的类类型,特别是考虑到程序集可能加载了“异常”类型的可能性,例如类型,例如Tuple<int, int>,行为仅限于满足该标准的一个类类型,不能另行做出:System.String