为什么事件不提供3种访问方法?

Mat*_*ias 4 c#

当执行事件,一个可以提供代码addremove事件处理程序.但是,可以通过三种方式访问​​事件:

MyEvent += Handler;                // add accessor
MyEvent -= Handler;                // remove accessor
MyEvent(this, EventArgs.Empty);    // not supported by an accessor
Run Code Online (Sandbox Code Playgroud)

是否有另一个称为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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道旧式模式,即实现OnMyEvent(...)方法.但这种方法存在两个重要缺点:

  1. 事件代码分散 - >组织代码基础较少
  2. 你不能轻易地重构事件(例如,重命名)

编辑:显然编译器团队已经为此功能设计了(参见参考资料GetRaiseMethod()).

Luc*_*ero 5

这是故意的,因此您不会调用您不"拥有"的事件.

编辑(以便编辑):即使在继承的类中,也不清楚是否应该始终能够调用它.通常是的,因此常见的模式很好:

  • 定义事件(不带前缀On)
  • 创建一个具有相同名称但前缀为的受保护虚拟方法,该方法On接受相应的,EventArgs并且只进行null检查和调用.
  • 始终通过虚拟方法引发事件

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