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

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

问题描述:

我有C++模板的知识,但不知道Java。.Net如何基于C++模板知识实现泛型?

有人会向我解释吗?

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

换句话说,类似MyClass<A> a这样的C++代码会导致编译器执行模板参数替换,并为该类生成二进制文件,就像在编译时它是普通类一样。

这里就是我的意思是:

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)。

看待它的一种方法是模板扩展发生在编译时,但泛型是.Net中的运行时功能。

该C#常见问题有一个good article和采访链接,超越了一些差异。