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

时间:2012-07-31 09:36:26

标签: c#

实现事件时,可以为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
    }
  }
}

我知道old-style pattern,即实现OnMyEvent(...)方法。但这种方法有两个重要的缺点:

  1. 事件代码分散 - >较少组织的代码库
  2. 您无法轻松重构事件(例如,重命名)
  3. 编辑:显然编译团队已经为此功能设计了(参见GetRaiseMethod())。

1 个答案:

答案 0 :(得分:5)

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

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

  • 定义一个事件(前缀为On
  • 创建一个具有相同名称但前缀为On的受保护虚拟方法,该方法接受相应的EventArgs并执行null检查和调用。
  • 始终通过虚拟方法提升事件

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