泛型類

泛型類

什麼是泛型,如何使用和定義泛型?泛型是具有佔位符(類型參數)的類、結構、介面和方法,這些佔位符是類、結構、介面和方法所存儲或使用的一個或多個類型的佔位符。泛型集合類可以將類型參數用作它所存儲的對象的類型的佔位符;類型參數作為其欄位的類型和其方法的參數類型出現。泛型方法可以將其類型參數用作其返回值的類型或者其形參的類型之一。下面的代碼闡釋一個簡單的泛型類定義。

代碼


Public Class Generic(Of T)
Public Field As T
End Class
C# 代碼
public class Generic
{
public T Field;
}
C++ 代碼
generic<typename T> public ref class Generic
{
public:
T Field;
};
在創建泛型類的實例時,會指定實際類型來替換類型參數。這會建立一個新的泛型類,稱為構造泛型類,選定的類型將替換所有出現的類型參數。最後得到按照您選擇的類型定製的類型安全的類,如下面的代碼所示。
Dim g As New Generic(Of String)
g.Field = "A string"
C# 代碼
Generic g = new Generic();
g.Field = "A string";
C++ 代碼
Generic^ g = gcnew Generic();
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 arg) { T temp = arg; ...}
C++ 代碼
generic 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 arg) {...}
}
class Generic
{
T M(T arg) {...}
}
C++ 代碼
ref class A
{
generic T G(T arg) {...};
};
generic ref class Generic
{
T M(T arg) {...};
};
Visual C++、C# 和 Visual Basic 都提供了對定義和使用泛型的完全支持。有關更多信息,請參見 Visual Basic 中的泛型類型、泛型介紹(C# 編程指南)和 Overview of Generics in C++。
嵌套類型和泛型
嵌套於泛型類型中的類型依賴於封閉泛型類型的類型參數,公共語言運行庫將這樣的嵌套類型視為泛型,即使它們沒有自己的泛型類型參數。在創建嵌套類型的實例時,需要為所有封閉泛型類型指定類型參數。