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

Pie*_*ens 3 c# generics

运行时文档中的MSDN Generics我注意到:

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

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

我是否正确地推断,尽管字符串数据类型在C#和CLR中都具有值类型语义,但使用字符串类型参数实例化的泛型类型将使用与其他引用类型相同的专用泛型类型,而不是比拥有自己的其他价值类型呢?无论哪种方式,这种行为都是相同的,因为V2引入了泛型?

Jon*_*eet 11

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

  • @PieterGeerkens:在谈论C#和CLR的背景下,"价值类型"在行为的各个方面具有非常具体的含义.具体来说,我首先要说的是"这个类型的变量的值是对象的引用,还是数据本身" - 而在`string`的情况下,变量的值绝对是引用.这种结构/类的区别是JIT关心的区别. (3认同)
  • @PieterGeerkens:但您决定使用的术语不在您引用的文档的上下文中.没有人认为你是个白痴 - 只是你没有考虑上下文.你引用的文档没有谈到"值类型语义" - 它谈到了值类型,并且在.NET的上下文中具有非常明确的含义,这根本不是同一个东西. (3认同)