當類別擁有大量事件(如 WinForms Control 超過 70 個事件)時,為每個事件建立獨立委派欄位會浪費記憶體。自訂 add/remove 存取器,搭配 EventHandlerList 鍵值儲存,可大幅降低記憶體佔用。
using System;
using System.ComponentModel;
public class Control : Component {
// 靜態唯讀物件作為鍵值,避免字串比對開銷
static readonly object MouseDownKey = new object();
static readonly object MouseUpKey = new object();
// 基底類別 Component 提供 Events 屬性 (EventHandlerList)
public event MouseEventHandler MouseDown {
add => Events.AddHandler(MouseDownKey, value);
remove => Events.RemoveHandler(MouseDownKey, value);
}
public event MouseEventHandler MouseUp {
add => Events.AddHandler(MouseUpKey, value);
remove => Events.RemoveHandler(MouseUpKey, value);
}
protected void OnMouseDown(MouseEventArgs e) {
if (Events[MouseDownKey] is MouseEventHandler handler)
handler(this, e);
}
}
键-委派 配對。Events[key] 回傳合併後的多播委派。| 場景 | 建議 |
|---|---|
| 事件數量 < 10 | 直接用預設 event 宣告,簡潔明瞭 |
| 事件數量 > 20 或為基底控制項庫 | 自訂存取器 + EventHandlerList |
| 需動態新增/移除事件型別 | 自訂存取器搭配 Dictionary |
add/remove 區塊不可為空,否則編譯錯誤。value 代表要新增/移除的委派,區塊區域變數不可命名為 value。abstract event)不允許提供存取器實作。