C#泛型如何工作?

时间:2019-03-04 04:34:59

标签: c# generics runtime compile-time

C ++模板在编译时生成。我听说C#泛型在运行时生成。这意味着它是在IL->执行时生成的吗?这部分也包含在运行时中吗?

1 个答案:

答案 0 :(得分:2)

您的断言是正确的,C ++模板是在编译时完全构建的, .Net 在运行时创建所需的类型。尽管通用类型需要在编译时解决,但是 MSIL 生成的使用和重用的类是在运行时生成的(尽管值类型和引用类型略有不同)

Differences Between C++ Templates and C# Generics (C# Programming Guide)

  

C#泛型和C ++模板都是提供以下功能的语言功能   支持参数化类型。但是,有很多差异   两者之间。在语法级别,C#泛型更简单   无需C ++复杂性的参数化类型的方法   模板。此外,C#不会尝试提供所有   C ++模板提供的功能。 在实施级别,   主要区别在于C#泛型类型替换是   在运行时执行,从而保留通用类型信息   实例化对象

Generics in the Run Time (C# Programming Guide)

值类型

  

首次构造通用类型 时,其值类型为   参数,运行时使用以下命令创建专用的通用类型:   提供的参数或适当替换的参数   MSIL中的位置。一次创建专门的泛型类型   每个用作参数的唯一值类型。

引用类型

  

对于引用类型,泛型的工作方式有所不同。 第一次   使用任何引用类型构造通用类型运行时   创建一个替换对象引用的专用泛型类型   MSIL中的参数。然后,每次   类型以引用类型作为其参数实例化,   不管它是什么类型,运行时都会重用以前的   创建通用类型的专用版本。这个有可能   因为所有引用的大小都相同。