String泛型参数是否被视为值类型或引用类型?

时间:2016-02-09 14:12:38

标签: c# generics

MSDN Generics in the Run Time文件我注意到:

  

当首次使用值类型作为参数构造泛型类型时,运行时会创建一个专用泛型类型,其中提供的参数或参数将替换为MSIL中的相应位置。为每个用作参数的唯一值类型创建一次专用泛型类型。

  

泛型对参考类型的工作方式有所不同。第一次使用任何引用类型构造泛型类型时,运行时会创建一个专用泛型类型,其中对象引用将替换MSIL中的参数。然后,每次构造类型以引用类型作为其参数进行实例化时,无论它是什么类型,运行时都会重用先前创建的泛型类型的专用版本。这是可能的,因为所有引用都是相同的大小。

我是否正确地推断,尽管字符串数据类型在C#和CLR中都拥有值类型语义,但是使用字符串 type参数将使用与其他引用类型相同的专用泛型类型,而不是像其他值类型那样拥有自己的类型?无论哪种方式,这种行为都是自引入泛型的V2以来一直相同的吗?

1 个答案:

答案 0 :(得分:11)

string是各种方式的引用类型。它在维基百科意义上有"value-type semantics",但这并不是MSDN中使用的术语中的值类型。在将所有非指针类型划分为“引用类型”或“值类型”的公共CLR和C#术语中,字符串绝对是引用类型。请注意,您也可以使用值语义轻松构建自己的引用类型 - 但它仍然是规范所关注的每种方式的引用类型。