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

C# 事件訂閱與取消訂閱完整教學:從 IDE 操作到程式碼實作

     編輯:關於C語言

事件模式核心概念

C# 事件實作了發佈-訂閱模式:

  • 發行者:擁有事件並決定何時引發
  • 訂閱者:註冊事件處理方法並決定如何回應
  • 一個事件可有多個訂閱者;一個訂閱者可處理多個事件
  • 無訂閱者時事件不會被引發

.NET 事件基於 EventHandler 委派與 EventArgs 基類建構。

使用 Visual Studio IDE 訂閱事件

  1. 開啟設計檢視,右鍵控制項選擇「屬性」
  2. 點擊屬性視窗頂部的「事件」圖標(閃電圖示)
  3. 雙擊欲處理的事件(如 Load、Click)
  4. IDE 自動產生空的事件處理方法與訂閱程式碼
// 自動產生的處理方法
private void Form1_Load(object sender, System.EventArgs e)
{
    // 處理邏輯
}

// Designer.cs 中自動產生的訂閱程式碼
this.Load += new System.EventHandler(this.Form1_Load);

以程式碼方式訂閱事件

1. 具名方法

// 定義處理方法(符合 EventHandler 簽章)
void HandleCustomEvent(object sender, CustomEventArgs e)
{
    // 處理邏輯
}

// 訂閱
publisher.RaiseCustomEvent += HandleCustomEvent;

// C# 1.0 風格(等效)
publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);

2. Lambda 表達式

public Form1()
{
    InitializeComponent();
    // 使用 Lambda 訂閱 Click 事件
    this.Click += (s, e) => 
    {
        MessageBox.Show(((MouseEventArgs)e).Location.ToString());
    };
}

3. 匿名方法

publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e)
{
    string s = o.ToString() + " " + e.ToString();
    Console.WriteLine(s);
};

⚠ 注意:使用匿名方法或 Lambda 訂閱後,若需取消訂閱較為麻煩,必須保存委派參考。建議需動態取消訂閱時使用具名方法。

取消訂閱事件

使用減法指派運算子 -=:

publisher.RaiseCustomEvent -= HandleCustomEvent;

為何要取消訂閱?

  • 防止記憶體洩漏:發行者持有訂閱者委派參考,阻礙 GC 回收
  • 在釋放訂閱者物件前務必取消訂閱
  • 避免重複處理導致邏輯錯誤

事件處理最佳實踐

  • 處理方法簽章建議使用 EventHandler<TEventArgs> 泛型委派
  • 引發事件前建立暫存副本避免競態條件:var handler = MyEvent; handler?.Invoke(this, e);
  • 考慮使用 async void 僅限於事件處理方法,其他情況用 async Task
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved