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

C# 事件與委派完整指南:從基礎觀念到實作模式

     編輯:關於C語言

什麼是事件?

在 C# 中,事件是類別或物件用來通知外部發生特定動作的機制。想像一個按鈕控制項:當使用者點擊時,按鈕本身不關心要執行什麼業務邏輯,它只負責「通知」有人點擊了它。這就是事件的核心精神——發布者不需要知道訂閱者的細節,只負責廣播消息。

事件模型的三大角色

  • 事件發行者:擁有事件並決定何時觸發的物件(如 Button)
  • 事件訂閱者:註冊接收通知並執行回應邏輯的物件
  • 委派:連接發行者與訂閱者的橋樑,本質是型別安全的函式指標

宣告與使用事件的標準流程

1. 定義委派型別

public delegate void CustomEventHandler(object sender, EventArgs e);

慣例上第一個參數為事件來源,第二個參數攜帶事件相關資料。雖然 .NET 建議遵循此模式,但 C# 僅強制要求回傳型別為 void。

2. 在類別中宣告事件

public class EventPublisher
{
    // 使用 event 關鍵字修飾,限制外部只能 += / -=
    public event CustomEventHandler OnCustomEvent;

    protected virtual void RaiseEvent()
    {
        // 線程安全的觸發模式:先複製再檢查
        var handler = OnCustomEvent;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

3. 訂閱與取消訂閱

public class EventSubscriber
{
    public void Subscribe(EventPublisher publisher)
    {
        publisher.OnCustomEvent += HandleEvent;
    }

    public void Unsubscribe(EventPublisher publisher)
    {
        publisher.OnCustomEvent -= HandleEvent;
    }

    private void HandleEvent(object sender, EventArgs e)
    {
        Console.WriteLine($"收到事件,來源:{sender}");
    }
}

進階主題:事件存取器與自訂儲存

若需完全控制事件的註冊邏輯(如使用字典管理大量事件),可使用 add/remove 存取器:

private EventHandlerList _events = new EventHandlerList();
private static readonly object EventKey = new object();

public event EventHandler CustomEvent
{
    add { _events.AddHandler(EventKey, value); }
    remove { _events.RemoveHandler(EventKey, value); }
}

最佳實踐總結

  1. 永遠使用 event 關鍵字,防止外部直接呼叫委派
  2. 觸發前先複製委派實例,避免競態條件
  3. 採用 EventHandler<TEventArgs> 泛型委派減少樣板碼
  4. 提供 protected virtual void OnEventName() 方法讓衍生類別覆寫
  5. 實作 IDisposable 時務必取消訂閱,防止記憶體洩漏

掌握事件機制,是寫出鬆耦合、可擴充 C# 應用程式的關鍵基石。

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