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