首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 2.0 泛型類別建立與使用完整教學:從 List<T> 到自訂約束

     編輯:關於C#

泛型核心價值

一次編寫,多型別複用。避免 object 裝箱/拆箱與型別轉換,編譯期保證型別安全,JIT 為每個封閉型別產生專屬機器碼。

使用內建泛型集合

using System.Collections.Generic;

List customers = new List();
customers.Add(new Customer("Motown-Jobs"));
customers.Add(new Customer("Fatman's"));

foreach (Customer c in customers)
    Console.WriteLine(c.CustomerName); // 強型別,無轉換

自訂泛型類別:由強型別重構而來

步驟 1:強型別版本

public class CustomerList : CollectionBase
{
    public Customer this[int i] { get => (Customer)List[i]; set => List[i] = value; }
    public int Add(Customer c) => List.Add(c);
}

步驟 2:引入型別參數 T

public class GenericList : CollectionBase
{
    public T this[int i] { get => (T)List[i]; set => List[i] = value; }
    public int Add(T item) => List.Add(item);
}

步驟 3:加入約束

// T 必須實作 IDisposable 且有公用無參建構子
public class DisposableList : CollectionBase 
    where T : class, IDisposable, new()
{
    public T this[int i] { get => (T)List[i]; set => List[i] = value; }
    public int Add(T item) => List.Add(item);
    
    public void DisposeAll()
    {
        foreach (T item in List) item.Dispose();
    }
}

約束關鍵字速查

約束語法說明
參考型別where T : class類別、介面、委派、陣列
實值型別where T : struct除 Nullable<T> 外的結構
無參建構子where T : new()需 public 無參建構子
基類where T : BaseClass繼承指定基類
介面where T : IInterface實作指定介面(可多個)
非受控型別where T : unmanagedC# 7.3+,無參考欄位的結構
預設建構子where T : notnullC# 8.0+,不可為 null 的型別

泛型靜態成員行為

靜態欄位/建構子以封閉型別為單位獨立:


public class Counter { public static int Count; static Counter() => Count = 0; }

Counter.Count++;   // 1
Counter.Count++;   // 2
Counter.Count++; // 1 (獨立)

泛型方法


public static void Swap(ref T a, ref T b) { T t = a; a = b; b = t; }
public void PushRange(Stack stack, params T[] items) 
    => Array.ForEach(items, stack.Push);

方法多載與泛型

  • 一般方法優先於泛型方法(簽名相同時)。
  • 泛型方法間若型別推斷導致簽名相同,呼叫端需明確指定型別參數。

總結

泛型是 C# 型別系統的基石,掌握「定義型別參數、替換具體型別、加入約束」三步驟,即可建立高效、型別安全、可複用的元件。

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