如果我有这个:
class Pair<T> {}
class Animal {}
class Human {}
然后:
Pair<Animal> a = new Pair<Animal>();
Pair<Human> h = new Pair<Human>();
我读到 CLR 只创建了一次 Pair
的特殊版本,其中
T
替换为 object
。 h
创建后,它会重新使用该版本。
但是我不明白这是什么意思。它如何以类型安全的方式知道 object
何时是 Animal
类型以及何时是 Human
类型?
“重用”这个词是什么意思?
最佳答案
不 - Java 就是这样做的 - 它在编译时检查是否使用了正确的类型,但在幕后,一切都只是一个 Pair<object>
.
C# 要好得多,因为它每次都创建一个真正的新类型。为什么这种方法更好?因为你可以在运行时使用反射找出类型(这在 Java 中是做不到的)
如果生成 IL,您可以看到这一点 - 您可以看到独特的类型:
IL_0000: nop
IL_0001: newobj UserQuery<UserQuery+Animal>+Pair`1..ctor
IL_0006: stloc.0 // a
IL_0007: newobj UserQuery<UserQuery+Human>+Pair`1..ctor
IL_000C: stloc.1 // h
IL_000D: ret
Pair`1..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: ret
Animal..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: ret
Human..ctor:
IL_0000: ldarg.0
IL_0001: call System.Object..ctor
IL_0006: ret
关于c# - 泛型的底层实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35945684/