在实现事件时,可以提供代码add
和remove
事件处理程序。但是,可以通过三种方式访问事件:
MyEvent += Handler; // add accessor
MyEvent -= Handler; // remove accessor
MyEvent(this, EventArgs.Empty); // not supported by an accessor
invoke
有另一个被称为负责的访问器不是很明显吗?我的想法是:
class BaseClass
{
public virtual event EventHandler MyEvent { add; remove; protected invoke; }
}
class DerivedClass : BaseClass
{
public override event EventHandler MyEvent
{
invoke
{
// new code before event
base.MyEvent(this, ...);
// new code after event
}
}
}
我知道旧式模式,即实现一个OnMyEvent(...)
方法。但是这种方法有两个重要的缺点:
- 事件代码分散 -> 代码库组织较少
- 您不能轻松地重构事件(例如,重命名它)
编辑:显然编译器团队已经为这个特性设计了(参见 参考资料GetRaiseMethod()
)。