Skip to main content
 首页 » 编程设计

.net之.Net如何基于C++模板知识实现泛型

2024年02月27日15jillzhang

我了解 C++ 模板,但不懂 Java。

谁能帮我解释一下吗?

请您参考如下方法:

它们实际上以非常不同的方式实现。在 C++ 中,模板在编译时专门化,而 .Net 泛型在运行时专门化。

换句话说,C++ 代码如 MyClass<A> a使编译器执行模板参数替换并为该类生成二进制文件,就好像它在编译时是常规类一样。

这就是我的意思:

template<typename T> 
class MyClass 
{ 
public: 
    void Foobar(const T& a); 
}; 
 
int main() 
{ 
    MyClass<int> myclass; 
    return 0; 
} 

它被编译成这样:

class MyClass_int // hypothetical class generated by compiler 
{ 
public: 
    void Foobar(const int& a); 
}; 
 
int main() 
{ 
    MyClass_int myclass; 
    return 0; 
} 

因此模板在编译的 C++ 代码的生成二进制文件中“不存在”。

在 .Net 中,同一行将导致编译器发出类的元数据,指示应在运行时替换泛型类型参数。实际上并没有听起来那么糟糕,因为 JIT 编译器应该能够巧妙地处理它们。

public class MyClass<T> 
{ 
    public void Foobar(T item) {} 
} 

这是用额外的信息编译的,表明它是一个通用类。 T参数在运行时使用时填写:

// This specialization occurs at runtime 
MyClass<int> myclass = new MyClass<int>(); 

.Net 泛型不会尝试复制所有 C++ 模板功能。 C++ 模板的功能更加强大,但使用起来却更加困难(C++ 模板实际上是 Turing-complete )。