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

Yin*_*Zhu 2 .net generics

我有C++模板的知识,但不懂Java.

有人会向我解释一下吗?

In *_*ico 6

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

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

这就是我的意思:

template<typename T>
class MyClass
{
public:
    void Foobar(const T& a);
};

int main()
{
    MyClass<int> myclass;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这被编译成这样的东西:

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

int main()
{
    MyClass_int myclass;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此,在编译的C++代码的结果二进制文件中"模板"不存在.

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

public class MyClass<T>
{
    public void Foobar(T item) {}
}
Run Code Online (Sandbox Code Playgroud)

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

// This specialization occurs at runtime
MyClass<int> myclass = new MyClass<int>();
Run Code Online (Sandbox Code Playgroud)

.Net泛型不会尝试复制所有C++模板功能.C++模板的功能明显更强大,代价是更难以使用(C++模板实际上是Turing-complete).