.NET Framework 中的泛型概觀
更新:2007 年 11 月
本主題將提供 .NET Framework 中泛型的概觀,以及泛型型別或方法的摘要。另外還會定義用來討論泛型的術語。
定義和使用泛型
泛型是指一些類別、結構、介面和方法,而它們具有其儲存或使用的一個或多個型別之替代符號 (型別參數)。泛型集合類別可能會將型別參數當做它所儲存的物件型別之替代符號;這些型別參數會以其欄位型別及其方法的參數型別之形式出現。泛型方法可能會將它的型別參數當做其傳回值的型別或是其中一個正規參數的型別使用。下列程式碼將說明簡單的泛型類別定義。
Public Class Generic(Of T)
Public Field As T
End Class
public class Generic<T>
{
public T Field;
}
generic<typename T> public ref class Generic
{
public:
T Field;
};
當您建立泛型類別的執行個體時,您要指定實際型別來替代型別參數,如此將會建立新的泛型類別 (稱為建構的泛型類別),而您選擇的型別會替代型別參數出現的任何地方。產生的結果是適合您選擇的型別之型別安全類別,如下列程式碼所說明。
Dim g As New Generic(Of String)
g.Field = "A string"
Generic<string> g = new Generic<string>();
g.Field = "A string";
Generic<String^>^ g = gcnew Generic<String^>();
g->Field = "A string";
泛型術語
下列詞彙是用來討論有關 .NET Framework 中的泛型:
「泛型型別定義」(Generic Type Definition) 是當做樣板使用的類別、結構或介面宣告,且具有它可以包含或使用的型別之替代符號。例如,Dictionary<TKey, TValue> 類別可包含兩種型別:索引鍵和值。因為它只是樣板,所以您無法建立泛型型別定義的類別、結構或介面的執行個體。
「泛型型別參數」(Generic Type Parameter) 或「型別參數」(Type Parameter) 為泛型型別或方法定義中的替代符號。Dictionary<TKey, TValue> 泛型型別有兩個型別參數:TKey 和 TValue,表示它的索引鍵和值的型別。
「建構的泛型型別」(Constructed Generic Type) 或「建構的型別」(Constructed Type) 為針對泛型型別定義的泛型型別參數指定型別的結果。
「泛型型別引數」(Generic Type Argument) 為用來替代泛型型別參數的任何型別。
「泛型型別」一詞通常包括建構的型別和泛型型別定義。
「條件約束」(Constraint) 是對泛型型別參數所設的限制。例如,您可以將型別參數限制為實作 IComparer<T> 泛型介面的型別,以確保此型別的執行個體可以排序。您也可以將型別參數限制為具有特定基底類別、具有預設建構函式或為參考型別或實值型別等型別。使用此泛型型別時不能以不滿足這些條件約束的型別引數來替代。
「泛型方法定義」(Generic Method Definition) 是具有兩個參數清單的方法:泛型型別參數的清單和型式參數的清單。型別參數可以傳回型別或型式參數的型別之形式出現,如下列程式碼所示。
Function Generic(Of T)(ByVal arg As T) As T Dim temp As T = arg ... End Function
T Generic<T>(T arg) { T temp = arg; ...}
generic<typename T> T Generic(T arg) { T temp = arg; ...};
泛型方法可以出現在泛型或非泛型型別上。很重要的一點是,方法不會只是因為屬於泛型型別,或甚至因為它的正規參數之型別為封入型別的泛型參數,就屬於泛型;只有當方法擁有它自己的型別參數清單時,才會是泛型。在下列程式碼中,只有方法 G 是泛型。
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
class A { T G<T>(T arg) {...} } class Generic<T> { T M(T arg) {...} }
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 Visual C++。
巢狀型別和泛型
泛型型別中的巢狀型別可能依據封入泛型型別的型別參數而定。Common Language Runtime 會將巢狀型別視為泛型,即使這些型別本身沒有泛型型別參數。當您建立巢狀型別的執行個體時,必須要為所有封入泛型型別指定型別引數。
請參閱
工作
概念
Overview of Generics in Visual C++
參考
System.Collections.ObjectModel