但是考虑一下,List<MyStruct>
无法知道我的结构的大小。我这样做会发生什么?是否有“List`1”的多个副本,每次我使用它与存储大小,它没有它创建一个新的实现? (调整T等的新偏移量)。
这可能有意义,因为源将在DLL内部的CIL中。但我完全猜测,它是如何完成的?也许是ECMA标准的参考或页面#?
答案 0 :(得分:9)
泛型使用开放和封闭泛型类型的概念:参数化泛型类定义(即List<T>
)是一种开放的泛型类型,运行时为代码中的每个不同用途生成一个封闭的泛型类型,即为List<int>
和List<MyStruct>
创建了不同的类型 - 对于每个封闭的泛型类型,T
的大小和类型在运行时是已知的。
来自MSDN的澄清:
当泛型类型或方法是 编译成微软中级 语言(MSIL),它包含元数据 将其标识为具有类型 参数。如何将MSIL用于通用 使用的类型根据是否不同而不同 提供的类型参数是一个值 类型或参考类型。
首先是泛型类型 用值类型构造为 参数,运行时创建一个 专用泛型类型 提供的参数或参数 在适当的地方取代 MSIL中的位置。专门 泛型类型创建一次 用作的每个唯一值类型 一个参数。
泛型的工作方式有所不同 参考类型。第一次a 泛型类型由任何构造 引用类型,运行时创建一个 带对象的专用泛型类型 引用替代 MSIL中的参数。然后,每一个 构造类型的时间 用引用类型实例化为 它的参数,不管是什么类型 它是,运行时重用了 以前创建的专业版 通用类型。这个有可能 因为所有参考都是一样的 大小
答案 1 :(得分:2)
CLR编译通用类的1个版本,并将其用于所有引用类型。它还为每种值类型使用编译1个版本,以优化性能。