C ++模板在编译时生成。我听说C#泛型在运行时生成。这意味着它是在IL->执行时生成的吗?这部分也包含在运行时中吗?
答案 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中的参数。然后,每次 类型以引用类型作为其参数实例化, 不管它是什么类型,运行时都会重用以前的 创建通用类型的专用版本。这个有可能 因为所有引用的大小都相同。