public delegate void ProcessHandler(object sender);
public class Class1
{
private event ProcessHandler _processHandler;
public event ProcessHandler ProcessStart
{
add { _processHandler += value; }
remove { _processHandler -= value; }
}
public void Process()
{
_processHandler?.Invoke(this);
// ... 業務邏輯
}
}
delegate 相當於型別安全的函式指標Windows Forms 控制項擁有數百個事件 (Click、MouseMove、Paint...),若每個事件皆宣告 private event Delegate _xxx,每個實例皆佔用大量欄位記憶體,即使從未訂閱。
public class Class1
{
private EventHandlerList _events = new EventHandlerList(); // 或 Hashtable
private static readonly object _processStartKey = new object();
private static readonly object _processEndKey = new object();
public event ProcessHandler ProcessStart
{
add { _events.AddHandler(_processStartKey, value); }
remove { _events.RemoveHandler(_processStartKey); }
}
public event ProcessHandler ProcessEnd
{
add { _events.AddHandler(_processEndKey, value); }
remove { _events.RemoveHandler(_processEndKey); }
}
public void Process()
{
var start = (ProcessHandler)_events[_processStartKey];
start?.Invoke(this);
// ...
var end = (ProcessHandler)_events[_processEndKey];
end?.Invoke(this);
}
}
static readonly object _key — 全域唯一、零記憶體增量EventHandlerList 或 Hashtable — 僅在首次 add 時配置節點這正是 Windows Forms 控制項能擁有數百事件卻輕量化的關鍵架構決策。