Share via


泛型的優點和限制

泛型功能可讓您指定泛型類別或方法所發生作用的型別,藉此將您所擔負的型別安全責任轉移到編譯器上。 您不需要編寫程式碼來測試資料型別是否正確,因為在編譯時期會強制進行這個作業。 此外,也會減少型別轉換的需求及執行階段的錯誤機率。

泛型可提供型別安全,而不會有多個實作所產生的額外負荷。 例如,您可以使用下列變數宣告來建立連結的字串清單:

Dim llist As New LinkedList(Of String)()
LinkedList<string> llist = new LinkedList<string>();
LinkedList<String^>^ llist = gcnew LinkedList<String^>();

您不需要從基底型別繼承及覆寫成員, 此連結的清單可立即使用。 如需 .NET Framework 所提供的泛型集合型別,請參閱 System.Collections.GenericSystem.Collections.ObjectModel

除了型別安全之外,泛型集合型別通常在儲存及管理實值型別上也會有較好的表現,因為不需要為實值型別進行 Box 處理。

泛型委派可啟用型別安全的回呼,而不需要建立多個委派類別。 例如,Predicate<T> 泛型委派可讓您建立一個可針對特定型別實作自己的搜尋準則之方法,以及將您的方法與類似 Find<T>FindLast<T>FindAll<T>Array 型別方法一起使用。

泛型委派也可用於動態產生的程式碼中,而不需要產生委派型別。 如此將會增加您可使用輕量動態方法的案例數目 (而不是產生整個組件)。 如需詳細資訊,請參閱 HOW TO:定義和執行動態方法DynamicMethod

在多數情況下,Visual Basic、Visual C++ 和 C# 編譯器可從內容中判斷泛型方法呼叫所使用的型別,如此可大為簡化使用泛型方法的語法。 例如,下列程式碼將示範呼叫 BinarySearch 泛型方法來搜尋字串陣列時所用的簡短格式和完整格式。 在簡短格式中,編譯器會從方法引數的型別來推斷正確的型別參數。

Dim index0 As Integer = Array.BinarySearch(myArray, "test string")
Dim index1 As Integer = Array.BinarySearch(Of String)(myArray, "test string")
int index0 = Array.BinarySearch(myArray, "test string");
int index1 = Array.BinarySearch<string>(myArray, "test string");
int index0 = Array::BinarySearch(myArray, "test string");
int index1 = Array::BinarySearch<String^>(myArray, "test string");

泛型的限制

下列是 .NET Framework 2.0 版中的一些泛型限制:

  • 泛型型別可以衍生自大部分的基底類別,例如 MarshalByRefObject (而條件約束則可以用來要求泛型型別參數是衍生自像 MarshalByRefObject 這樣的基底類別)。 不過,這個版本的 .NET Framework 不支援內容繫結的泛型型別。 泛型型別可以衍生自 ContextBoundObject,但嘗試建立該型別的執行個體會造成 TypeLoadException

  • 列舉不能具有泛型型別參數。 只有在巢狀於使用 Visual Basic、C# 或 C++ 定義的泛型型別內時,列舉才可能是泛型。 如需詳細資訊,請參閱一般型別系統中的<列舉>。

  • 輕量動態方法不可以是泛型。 如需動態方法的詳細資訊,請參閱反映發出動態方法案例

  • 在 Visual Basic、C# 和 C++ 中,包含在泛型型別中的巢狀型別無法具現化 (Instantiated),除非已經將型別指派給所有封入型別 (Enclosing Type) 的型別參數。 這麼說的另一個原因是,在反映 (Reflection) 中,使用這些語言所定義的巢狀型別包括了其所有封入型別的型別參數, 這可讓您在巢狀型別的成員定義中使用封入型別的型別參數。 如需詳細資訊,請參閱 MakeGenericType 中的<巢狀型別>。

    注意事項注意事項

    經由在動態組件中發出程式碼或經由使用 Ilasm.exe (MSIL 組譯工具) 所定義的巢狀型別並不需要包含其封入型別的型別參數;不過,如果沒有包含,那麼型別參數就不在巢狀類別的範圍中。

    如需詳細資訊,請參閱 MakeGenericType 中的<巢狀型別>。

請參閱

參考

System.Collections.Generic

System.Collections.ObjectModel

概念

.NET Framework 中的泛型

.NET Framework 中的泛型集合

管理陣列和清單的泛型委派

泛型介面