2010-06-05 34 views

回答

6

它們實際上以非常不同的方式實施。在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)。

1

看待它的一種方法是模板擴展發生在編譯時,但泛型是.Net中的運行時功能。

該C#常見問題有一個good article和採訪鏈接,超越了一些差異。