事件屬性
如果一個類引發了大量事件,則每個代理一個欄位的儲存成本可能是不可接受的。 .NET Framework 為這些情況提供事件屬性 。這樣,你可以使用其他資料結構(如 EventHandlerList
)來儲存事件委託:
public class SampleClass
{
// Define the delegate collection.
protected EventHandlerList eventDelegates = new EventHandlerList();
// Define a unique key for each event.
static readonly object someEventKey = new object();
// Define the SomeEvent event property.
public event EventHandler SomeEvent
{
add
{
// Add the input delegate to the collection.
eventDelegates.AddHandler(someEventKey, value);
}
remove
{
// Remove the input delegate from the collection.
eventDelegates.RemoveHandler(someEventKey, value);
}
}
// Raise the event with the delegate specified by someEventKey
protected void OnSomeEvent(EventArgs e)
{
var handler = (EventHandler)eventDelegates[someEventKey];
if (handler != null)
handler(this, e);
}
}
這種方法廣泛用於像 WinForms 這樣的 GUI 框架,其中控制元件可以有數十甚至數百個事件。
請注意,EventHandlerList
不是執行緒安全的,因此如果你希望從多個執行緒使用你的類,則需要新增鎖定語句或其他同步機制(或使用提供執行緒安全性的儲存)。