事件封裝委派,只允許 +=/-= 操作,防止外部直接呼叫或覆寫委派鏈結,確保封裝性。
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!");
}
適用於大量事件(如 UI 控制項)需集中管理委派以節省記憶體:
public event EventHandler Click {
add => _events.AddHandler(EventClick, value);
remove => _events.RemoveHandler(EventClick, value);
}
virtual/abstract/override。this。使用 ?.Invoke 或複製委派到區域變數,避免競爭條件。
Clicked、Saved)。OnEventName protected virtual 方法供衍生類別擴充。EventHandler<TEventArgs> 泛型委派減少自訂委派宣告。