4

在实现事件时,可以提供代码addremove事件处理程序。但是,可以通过三种方式访问​​事件:

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(...)方法。但是这种方法有两个重要的缺点:

  1. 事件代码分散 -> 代码库组织较少
  2. 您不能轻松地重构事件(例如,重命名它)

编辑:显然编译器团队已经为这个特性设计了(参见 参考资料GetRaiseMethod())。

4

1 回答 1

5

这是故意的,这样您就不会调用您不“拥有”的事件。

编辑(解决您的编辑问题):即使在继承的类中,您是否应该始终能够调用它也不清楚。通常是的,因此通用模式已经很好地列出:

  • 定义一个事件(带前缀On
  • 创建一个具有相同名称但前缀为 的受保护虚拟方法On,它接受适当的EventArgs并仅执行null检查和调用。
  • 总是通过虚方法引发事件

这种模式允许更大的灵活性;可以通过继承该方法更改或省略事件或进行事件后处理。如果不存在方法,则事件调用是私有的。

于 2012-07-31T09:39:12.003 回答