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

C# 委派完整進階指南:從委派鏈到事件封裝

     編輯:關於C語言

什麼是委派?

委派是型別安全的函式指標,封裝「具有相同簽名的一或多個方法」。宣告即定義一種新型別:

public delegate int Handler(int x, int y);

四步驟使用流程

  1. 定義委派型別
  2. 撰寫目標方法 (簽名一致)
  3. 建立委派實例並指向方法
  4. 呼叫 Invoke() 或直接像方法一樣呼叫

演進簡史:三代簡化寫法

1. .NET 1.x 顯式實例化

Handler h = new Handler(obj.Add);

2. .NET 2.0 方法群組轉換

Handler h = obj.Add; // 隱式 new Handler

3. 內建泛型委派:Func / Action / Predicate

委派回傳值參數上限適用場景
Func<T1, T2, TResult>有16通用函式
Action<T1, T2>無16副作用操作
Predicate<T>bool1篩選條件
Func<int, int, int> add = (x, y) => x + y;
Action<string> log = s => Console.WriteLine(s);

4. 匿名方法

Func<int, int, int> sub = delegate(int x, int y) { return x - y; };

5. Lambda 運算式 (C# 3.0+)

Func<int, int, int> mul = (x, y) => x * y; // 型別推論、極致精簡

委派鏈

委派可透過 += 串聯多個方法,形成 MulticastDelegate:

Action<int, int> chain = (x, y) => Console.WriteLine($"Sum: {x + y}");
chain += (x, y) => Console.WriteLine($"Diff: {x - y}");
chain(10, 5); // 依序執行兩個方法

// 列舉鏈中所有方法
foreach (var d in chain.GetInvocationList())
    Console.WriteLine(d.Method.Name);

注意: 有回傳值的委派鏈,最終回傳值為最後一個方法的結果。

事件:委派的封裝與受限

事件本質是 private 委派欄位 + add/remove 存取器,防止外部直接呼叫或清空訂閱清單。

標準事件模式四步驟

  1. 定義委派型別 (慣例 EventHandler 尾綴)
  2. 宣告 event 關鍵字
  3. 提供 protected virtual void OnXxx(EventArgs e) 引發方法
  4. 訂閱者用 += 註冊,-= 移除
// 1. 委派
public delegate void CalcEventHandler(object sender, CalcEventArgs e);

// 2. 事件
public event CalcEventHandler Calc;

// 3. 引發
protected virtual void OnCalc(CalcEventArgs e)
{
    Calc?.Invoke(this, e);
}

// 4. 參數類別
public class CalcEventArgs : EventArgs
{
    public int X { get; }
    public int Y { get; }
    public CalcEventArgs(int x, int y) { X = x; Y = y; }
}

IL 視角:event 編譯後產生什麼?

  • private CalcEventHandler calc; (委派欄位)
  • add_Calc / remove_Calc (存取器,對應 +=/-=)
  • 外部無法直接 calc.Invoke(),只能透過 OnCalc 間接引發。

進階議題 (未展開)

  • BeginInvoke / EndInvoke 非同步呼叫 (APM 模式)
  • Task.Run / async-await 現代非同步替代方案
  • 弱事件模式防止記憶體洩漏

總結

委派是 C# 函式式程式設計的基石,掌握 Func/Action、Lambda、委派鏈 與 事件封裝,能寫出更具彈性、可測試且符合 SOLID 原則的程式碼。

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