首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

C# 泛型完整指南:從基礎到協變/逆變

     編輯:更多程式設計知識

泛型是 C# 2.0 引入的核心特性,提供型別安全、效能提升(避免裝箱/拆箱)、程式碼重用三大優勢。本文系統梳理泛型類別、介面、委派、方法、約束、繼承與協變/逆變。

一、泛型類別基礎

[Serializable]
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T> {
    public T this[int index] { get; set; }
    public void Add(T item);
    public bool Contains(T item);
    public T[] ToArray();
    // ...
}

<T> 為型別參數,命名慣例以 T 開頭(TKey, TValue)。使用時指定實際型別:

var list = new List<int>();
list.Add(1);        // 型別安全:編譯期阻擋 list.Add("str")
int val = list[0];  // 無裝箱/拆箱,直接存取

二、泛型解決的兩大問題

  1. 演算法重用:單一排序方法適用 int、double、string 等任何實作 IComparable<T> 的型別。
  2. 型別安全的參數化:避免使用 object 造成裝箱效能損耗,且編譯期攔截型別不匹配錯誤。

三、實用泛型集合

  • ObservableCollection<T>:集合變更觸發 CollectionChanged 事件,WPF/MVVM 資料綁定必備。
  • BlockingCollection<T>:執行緒安全、支援生產者/消費者模式、可設定容量上限與 CompleteAdding。

四、泛型繼承規則

  • 泛型類別可繼承非泛型類別:class MyOther<T> : MyBase
  • 非泛型類別繼承泛型類別必須指定型別引數:class MyDerived : MyOther<int>(不可寫 MyOther<T>)
  • 泛型類別繼承泛型類別可保留型別參數:class MyDerived<T> : MyOther<T>

五、泛型介面與委派

介面泛型化避免裝箱:IComparable<T>.CompareTo(T other) vs IComparable.CompareTo(object obj)。
委派泛型化:Action<T>(無回傳)、Func<T, TResult>(有回傳)、Predicate<T>(回傳 bool),框架內建支援至 16 參數。

六、泛型方法

型別參數宣告於方法層級:

public TParam CompareTo<TParam>(TParam other) { ... }

呼叫時編譯器自動推斷型別:obj.CompareTo(4) → TParam = int。若多個參數同為 T,推斷要求實參型別一致。

七、泛型約束

class MyClass<T> where T : IComparable<T>, new(), class { ... }
約束含義
where T : classT 必為參考型別
where T : structT 必為實值型別
where T : new()T 必有公用無參建構子
where T : BaseClassT 必繼承自 BaseClass
where T : IInterfaceT 必實作介面

無約束時,使用 default(T) 取得型別預設值(參考型別 null、實值型別 0)。

八、協變與逆變

預設泛型為不變性:List<string> 不能指派給 List<object>。
協變:out T 僅作輸出(回傳值),允許 IEnumerable<string> → IEnumerable<object>。
逆變:in T 僅作輸入(參數),允許 Action<object> → Action<string>。
委派範例:delegate TResult Func<in T, out TResult>(T arg);

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved