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

C# 事件深度解析:宣告、訂閱、靜態事件與存取器自訂

     編輯:關於C#

事件本質:基於委派的發布/訂閱機制

事件封裝委派,只允許 +=/-= 操作,防止外部直接呼叫或覆寫委派鏈結,確保封裝性。

標準事件宣告模式

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

public class Button {
    // 編譯器自動產生私有委派欄位 + add/remove 存取器
    public event EventHandler Click;

    protected virtual void OnClick(EventArgs e) {
        Click?.Invoke(this, e); // 執行緒安全寫法
    }
}

事件訂閱與撤銷

var btn = new Button();
btn.Click += Btn_Click;   // 訂閱
btn.Click -= Btn_Click;   // 撤銷

void Btn_Click(object sender, EventArgs e) {
    Console.WriteLine("Button clicked!");
}

進階主題

1. 事件存取器自訂

適用於大量事件(如 UI 控制項)需集中管理委派以節省記憶體:

public event EventHandler Click {
    add => _events.AddHandler(EventClick, value);
    remove => _events.RemoveHandler(EventClick, value);
}

2. 靜態事件

  • 屬於類別,非實例。
  • 不可使用 virtual/abstract/override。
  • 存取器中不可用 this。

3. 事件引發的執行緒安全

使用 ?.Invoke 或複製委派到區域變數,避免競爭條件。

最佳實務檢核表

  • [ ] 事件命名採過去式動詞(Clicked、Saved)。
  • [ ] 提供 OnEventName protected virtual 方法供衍生類別擴充。
  • [ ] 使用 EventHandler<TEventArgs> 泛型委派減少自訂委派宣告。
  • [ ] 文件註解說明事件引發時機與參數含義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved