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