直接宣告事件會導致編譯器生成大量多執行緒安全代碼,影響效能。ASP.NET 控件應採用 EventHandlerList 顯式管理事件:
// 事件鍵值
private static readonly object ValidateCreditCardFormKey = new object();
public event ValidateCreditCardFormEventHandler ValidateCreditCardForm
{
add { Events.AddHandler(ValidateCreditCardFormKey, value); }
remove { Events.RemoveHandler(ValidateCreditCardFormKey, value); }
}
protected void OnValidateCreditCardForm(ValidateCreditCardFormEventArgs args)
{
var handler = Events[ValidateCreditCardFormKey] as ValidateCreditCardFormEventHandler;
if (handler != null) handler(this, args);
}
Control.Events 內部使用單向鏈表儲存委托,僅在訂閱時分配記憶體。此模式為 ASP.NET 內建控件標準做法,兼顧效能與記憶體效率。
下篇將示範完整的信用卡表單控件事件定義流程。