【发布时间】:2017-04-14 07:32:04
【问题描述】:
我读过引用类型都使用相同的构造类:
泛型对引用类型的工作方式有所不同。第一次使用任何引用类型构造泛型类型时,运行时会创建一个专门的泛型类型,其中对象引用替换 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 也会为不同的构造类型处理 Type 对象的创建? 有没有办法直接查看 CLR 生成和不生成的内容?
【问题讨论】:
-
类型仍然非常不同。文本试图说的(它可以以更清晰的方式做,并且那里有很多其他不好的写作)是用于实现这些类型的实际代码可以为所有具有引用类型的实例共享。不过,这是一个程序员通常不太关心的实现细节。您需要连接一个调试器并检查 jitted 代码才能看到这一点;我不确定 C# 级别是否有任何方法可以验证这一点。