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

C# 2.0 泛型程式設計基礎:定義、繼承、約束與 JIT 實例化機制

     編輯:關於C語言

前言

泛型是 C# 2.0 / .NET 2.0 引入的里程碑特性,實現「型別參數化」,同時解決型別安全與效能(避免裝箱/拆箱)兩大痛點。本文系統整理泛型類別、介面、委派、方法定義、繼承規則、約束條件與執行期實例化機制。

泛型類別定義與實例化


public class Test
{
    private T _name;
    private S _age;
    public Test(T name, S age) { _name = name; _age = age; }
    public void Print() => Console.WriteLine($"{_name}, {_age}");
}

// 使用
var t = new Test("SHY520", 22);
t.Print();

泛型繼承規則

子類別繼承泛型父類別時,必須滿足下列任一條件:

  1. 父類別型別參數已具體化:class Child : Test { }。
  2. 子類別同為泛型且型別參數對應:class Child : Test { } 或 class Child : Test { }。

// 錯誤:父類別型別參數未綁定
class Child : Test { } // ❌

// 正確
class Child1 : Test { }
class Child2 : Test { }
class Child3 : Test { }

泛型介面與委派


// 介面
public interface IList { T[] GetElements(); }
public interface IDictionary { void Add(K key, V value); }

// 實作
public class MyList : IList, IDictionary
{
    public T[] GetElements() => throw new NotImplementedException();
    public void Add(int key, T value) => throw new NotImplementedException();
}

// 委派
public delegate string FuncDelegate(T value);

static string F(int i) => "int";
static string G(string s) => "string";

var d1 = new FuncDelegate(G);
var d2 = new FuncDelegate(F);

泛型方法

  • 可定義於泛型或非泛型類別中。
  • 支援多載(同名不同型別參數)。
  • 覆寫時約束自動繼承,無需重複指定。

public class GenericClass
{
    public T GetValue(T t) => t; // 泛型方法
    public int GetValue(int i) => i; // 多載

    public void UseMethod()
    {
        int x = GetValue(10); // 明確指定型別參數
    }
}

// 覆寫範例
abstract class Parent
{
    public abstract K Test(K k, V v) where K : V;
}
class Child : Parent
{
    public override T Test(T t, S s) => t; // 約束自動繼承
}

泛型約束

約束語法意義
實質型別where T : structT 必為 ValueType(不可為 nullable)
參考型別where T : classT 必為參考型別(類別、介面、委派、陣列)
預設建構函式where T : new()T 必須有 public 無參數建構函式
基類/介面where T : BaseClass
where T : IInterface
T 必須繼承自指定類別或實作介面
非受控型別where T : unmanagedT 為非受控型別(C# 7.3+)
委派where T : DelegateT 為委派型別(C# 7.3+)
Enumwhere T : EnumT 為列舉型別(C# 7.3+)

多重約束以逗號分隔:where T : class, IComparable, new()。

JIT 實例化機制

  1. 第一輪編譯:C# 編譯器產生泛型 IL 與中繼資料,型別參數以佔位符表示,不實例化。
  2. JIT 編譯時:首次遇到具體型別(如 List),JIT 以實際型別取代佔位符產生機器碼。
  3. 程式碼共享: