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

C# 2.0 泛型委派與事件:簡化事件處理的強大利器

     編輯:關於C語言

前言:重構舊系統的驚喜體驗

最近我將一個舊系統的訊息機制使用 C# 2.0 的泛型進行重寫,結果令人驚喜:代碼變得異常簡潔,執行效率也明顯提升(MSDN 文檔也確認了這一點)。今天就來和大家聊聊這其中的門道,順便回顧一下經典的 .NET 事件模型。

經典回顧:.NET 事件模型的兩大核心要素

.NET 框架的訊息模型建立在委派之上,要觸發一個事件,必須考慮兩個基本元素:

1. 事件的源頭觸發者

它定義了一個事件,包含委派類型聲明、事件成員實例化以及觸發邏輯:

public class EventSender
{
    // 聲明一個委派類型,指向無返回值、帶兩個參數的方法
    public delegate void MyEventHandler(object sender, EventArgs e);
    
    // 由該委派實例化一個事件成員
    public event MyEventHandler myEvent;
    
    // 在邏輯判斷處觸發事件
    // 即向系統通知:「老大聽好了,我發出了一個事件」
    this.myEvent(this, null);
}

2. 事件的接收者

它註冊了該事件,表示願意接收並處理:

public class EventReceiver
{
    // 實例化事件發送者
    EventSender sender = new EventSender();
    
    // 註冊事件,告知系統:「如果這個對象發出該事件,我願意通過 OnReceivedTheEvent 方法處理」
    sender.myEvent += new MyEventHandler(OnReceivedTheEvent);
    
    private void OnReceivedTheEvent(object sender, EventArgs e)
    {
        // 實現具體處理邏輯
    }
}

當然,如果不需要傳遞自定義的 EventArgs,可以直接使用系統預定義的 EventHandler 委派,省去定義委派類型的步驟。但這種情況下只能起通知作用,無法傳遞運行時數據,因為 System.EventArgs 是最基礎的事件參數類,無法攜帶用戶自定義信息(如對象的某個狀態值)。

C# 2.0 泛型帶來的革命性改變

C# 2.0 引入泛型機制後,事件處理變得極其便捷。配套推出的 EventHandler<T> 是 EventHandler 的泛型版本。下面通過具體代碼對比,感受泛型帶來的視覺衝擊與編程樂趣。

任務:定義並註冊三個事件,分別使用三種不同的 EventArgs 繼承類傳遞不同數據

C# 1.1 時代的寫法(繁瑣)

// 定義(在假定類 MyClass 中)
public delegate void MyEventHandler1(object sender, MyEventArgs1 myEventArgs1);
public delegate void MyEventHandler2(object sender, MyEventArgs2 myEventArgs2);
public delegate void MyEventHandler3(object sender, MyEventArgs3 myEventArgs3);

public event MyEventHandler1 event1;
public event MyEventHandler2 event2;
public event MyEventHandler3 event3;

// 註冊(假定已實例化 MyClass)
myClass.event1 += new EventHandler(this, myEventArgs1);
myClass.event2 += new EventHandler(this, myEventArgs1);
myClass.event3 += new EventHandler(this, myEventArgs1);

C# 2.0 泛型寫法(簡潔)

// 定義(在假定類 MyGoodClass 中)
public event EventHandler<MyEventArgs1> event1;
public event EventHandler<MyEventArgs2> event2;
public event EventHandler<MyEventArgs3> event3;

// 註冊(假定已實例化 MyGoodClass)
myGoodClass.event1 += new EventHandler<MyEventArgs1>(this, myEventArgs1);
myGoodClass.event2 += new EventHandler<MyEventArgs2>(this, myEventArgs2);
myGoodClass.event3 += new EventHandler<MyEventArgs3>(this, myEventArgs3);

對比顯而易見:代碼量大幅減少,可讀性顯著提升。但泛型的優勢遠不止於此——它還帶來了類型安全和線程安全的雙重保障。以往傳遞通用數據常用 object 類型,雖技術可行,但裝箱/拆箱開銷大,且存在 InvalidCastException 等類型轉換風險。泛型從根本上解決了這些痛點。

總結

C# 2.0 的泛型委派 EventHandler<T> 讓事件定義與註冊變得「以一當百」——一行代碼替代過去的委派聲明、事件聲明、註冊三步走。這不僅是語法糖,更是類型安全編程範式的落地實踐。如果你還在維護 .NET 2.0 以上版本的項目,強烈建議拥抱泛型事件模式,體驗「簡潔之美」。

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