代碼
Public Class Generic(Of T)
Public Field As T
End Class
C# 代碼
public class Generic<T>
{
public T Field;
}
C++ 代碼
generic<typename T> public ref class Generic
{
public:
T Field;
};
在創建泛型類的實例時,會指定實際類型來替換類型參數。這會建立一個新的泛型類,稱為構造泛型類,選定的類型將替換所有出現的類型參數。最後得到按照您選擇的類型定製的類型安全的類,如下面的代碼所示。
Visual Basic 代碼
Dim g As New Generic(Of String)
g.Field = "A string"
C# 代碼
Generic<string> g = new Generic<string>();
g.Field = "A string";
C++ 代碼
Generic<String^>^ g = gcnew Generic<String^>();
g->Field = "A string";
解釋
下面的術語用於討論 .NET Framework 中的泛型:
“泛型類型定義”是用作模板的類、結構或接口聲明,其中具有該類、結構或接口聲明可以包含或使用的類型的占位符。例如,Dictionary 類可以包含兩種類型:鍵和值。因為它只是一個模板,您不能創建作為泛型類型定義的類、結構或接口的實例。
“泛型類型參數”或稱“類型參數”是泛型類型或方法定義中的占位符。Dictionary 泛型類型具有兩個類型參數:TKey 和 TValue,分別表示其鍵和值的類型。
“構造泛型類型”或稱“構造類型”是為泛型類型定義的泛型類型參數指定類型得到的結果。
“泛型類型參數”是替換泛型類型參數的任何類型。
一般術語“泛型類型”包括構造類型和泛型類型定義。
“約束”是加在泛型類型參數上的限制。例如,可以將類型參數限制為實現 IComparer 泛型接口的類型以確保可以對該類型的實例進行排序。還可以將類型參數限制為具有特定基類的類型、具有默認構造函式的類型或是引用類型或值類型。泛型類型的用戶不能替換不滿足這些約束的類型參數。
“泛型方法定義”是具有兩個參數列表的方法:一個泛型類型參數列表和一個形參列表。類型參數可以作為返回類型或形參的類型出現,如下面的代碼所示。
Visual Basic 代碼
Function Generic(Of T)(ByVal arg As T) As T
Dim temp As T = arg
...
End Function
C# 代碼
T Generic<T>(T arg) { T temp = arg; ...}
C++ 代碼
generic<typename T> T Generic(T arg) { T temp = arg; ...};
泛型方法可以出現在泛型或非泛型類型上。需要注意的是,並不是只要方法屬於泛型類型,或者甚至是方法的形參的類型是封閉類型的泛型參數,就可以說方法是泛型方法。只有當方法具有它自己的類型參數列表時,才能稱其為泛型方法。在下面的代碼中,只有方法 G 是泛型方法。
Visual Basic 代碼
Class A
Function G(Of T)(ByVal arg As T) As T
...
End Function
End Class
Class Generic(Of T)
Function M(ByVal arg As T) As T
...
End Function
End Class
C# 代碼
class A
{
T G<T>(T arg) {...}
}
class Generic<T>
{
T M(T arg) {...}
}
C++ 代碼
ref class A
{
generic<T> T G(T arg) {...};
};
generic<typename T> ref class Generic
{
T M(T arg) {...};
};
Visual C++、C# 和 Visual Basic 都提供了對定義和使用泛型的完全支持。有關更多信息,請參見 Visual Basic 中的泛型類型、泛型介紹(C# 編程指南)和 Overview of Generics in C++。
嵌套類型和泛型
嵌套於泛型類型中的類型依賴於封閉泛型類型的類型參數,公共語言運行庫將這樣的嵌套類型視為泛型,即使它們沒有自己的泛型類型參數。在創建嵌套類型的實例時,需要為所有封閉泛型類型指定類型參數。