事件属性

如果一个类引发了大量事件,则每个代理一个字段的存储成本可能是不可接受的。 .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 不是线程安全的,因此如果你希望从多个线程使用你的类,则需要添加锁定语句或其他同步机制(或使用提供线程安全性的存储)。