我读过的引用类型都使用相同的构造类:C# - 构造类类型的对象
泛型引用类型有所不同的工作。第一次使用任何引用类型构造泛型类型时,运行时创建一个专用泛型类型,其中的对象引用代替MSIL中的参数。然后,每当构造类型以引用类型作为其参数实例化时,无论它是何种类型,运行时都会重用先前创建的泛型类型的专用版本。这是可能的,因为所有引用都是相同的大小。 (Generics in the Run Time (C# Programming Guide))
但是,在基于具有不同类型参数的相同泛型构造的对象上调用GetType()时,会收到两种不同的类型。其中A和B均为类,RefType的是一个通用:
RefType<A> a = new RefType<A>();
RefType<B> b = new RefType<B>();
Console.WriteLine("a type is "+a.GetType());
Console.WriteLine("b type is "+b.GetType());
结果:
"a type is RefType`1[A]"
"b type is RefType`1[B]"
这是否意味着CLR处理类型对象的创建不同的构造类型,即使有是不是“真正的”专门实例化? 有没有办法直接看到什么是和不是由CLR生成的?
*类型*仍然非常明显。文本试图说出的内容(它可以以更清晰的方式进行,而且其中有许多其他不好的写法)是用于实现这些类型的实际代码可以为所有具有引用类型的实例共享。不过,这是一个实现细节,通常对程序员来说很少关注。你需要连接一个调试器并检查jitted代码来看看这个;我不确定C#级别有什么方法可以验证这一点。 –