事件屬性

如果一個類引發了大量事件,則每個代理一個欄位的儲存成本可能是不可接受的。 .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 不是執行緒安全的,因此如果你希望從多個執行緒使用你的類,則需要新增鎖定語句或其他同步機制(或使用提供執行緒安全性的儲存)。