c# - 泛型的底层实现

标签 c# generics

如果我有这个:

class Pair<T> {}

class Animal {}
class Human {}

然后:

Pair<Animal> a = new Pair<Animal>();
Pair<Human> h = new Pair<Human>();

我读到 CLR 只创建了一次 Pair 的特殊版本,其中 T 替换为 objecth 创建后,它会重新使用该版本。

但是我不明白这是什么意思。它如何以类型安全的方式知道 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/

相关文章:

c# - 用于 ID 未填充的 .NET Core Cosmos 私有(private) setter

c# - 跨域使用ajax无法传递参数

Java 将列表类型传递给泛型方法?

c# - 泛型类型参数和类型

c# - 你能传递一个类型并强制在 C# 中传递什么类型吗?

c# - SqlDataReader 超出范围错误

c# - 在 DateTime 比较期间,如何强制 Entity Framework 使用 datetime 而不是 datetime2?

java - 类型安全的异构容器模式来存储项目列表

c++ - 如何概括 std::chrono::duration(s)?

java - 如何实现扩展 Comparable 的列表列表?