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

Effective C# 原則 21:使用委派實作回呼,支援非同步與多目標通知

     編輯:關於C#

回呼:非同步服務與用戶端的資訊回饋

委派是 C# 實作回呼的核心機制:型別安全的函式參考容器,可包含靜態/實例方法,支援多播(串聯多個目標)。

多播委派的兩大陷阱

  1. 非例外安全:鏈上任一目標拋出例外,後續目標將不被呼叫。
  2. 回傳值僅保留最後一個:前面目標的回傳值被忽略。
public delegate bool ContinueProcessing();
public void LengthyOperation(ContinueProcessing pred) {
    foreach (var cl in _container) {
        cl.DoLengthyOperation();
        if (!pred()) return; // 若 pred 為多播委派,僅檢查最後一個目標回傳值!
    }
}

正確處理多播回傳值:手動遍歷 InvocationList

public void LengthyOperation(ContinueProcessing pred) {
    foreach (var cl in _container) {
        cl.DoLengthyOperation();
        bool bContinue = true;
        foreach (ContinueProcessing pr in pred.GetInvocationList()) {
            bContinue &= pr(); // 所有目標皆回傳 true 才繼續
        }
        if (!bContinue) return;
    }
}

明確定義語意:所有回呼皆同意才繼續。

委派 vs 介面 vs 事件

  • 介面:強契約,消費者必須實作完整介面,耦合度高。
  • 事件:專為「通知」設計,語意為單向廣播。
  • 委派:最輕量、彈性最高的回呼機制。執行期決定目標,支援多目標,無需定義介面類別。

適用情境

  • 非同步作業進度回報、取消確認。
  • 演算法自訂比較/過濾邏輯(如 List.Sort(Comparison))。
  • 外掛架構:主程式載入外掛組件,透過委派回呼外掛功能。

總結

委派提供執行期綁定、型別安全、多目標支援的回呼機制。處理多播時務必注意例外傳播與回傳值語意,必要時手動遍歷 GetInvocationList() 實作自訂聚合邏輯。

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