2012-07-31 78 views
4

执行事件时,可以提供代码addremove事件处理程序。然而,事件可以通过三种方式获得:为什么事件不提供3个访问器方法?

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. 你不能简单的重构事件(例如,将其重命名)

编辑:很明显,编译器团队已经为此功能而设计(请参阅GetRaiseMethod())。

回答

5

这是有目的的,所以你不要调用你不“拥有”的事件。

编辑(以解决您的编辑问题):即使在继承类中,您是否应始终能够调用它仍不清楚。一般是,因此,共用图案是公列明:

  • 定义(On前缀)
  • 创建具有相同名称的受保护的虚拟方法,但用On前缀一个事件,它接受适当的EventArgs,只是null检查和调用。
  • 始终通过虚拟方法

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

+0

你是什么意思的“自己”? – Matthias 2012-07-31 09:41:18

+1

如果你可以去做'button1.Click(...)',那么它会引发事件,而不会被按钮本身触发。只有Button类应该能够引发事件。这就是为什么你可以在定义它的类中调用它,但不能以其他方式调用它。 – Lucero 2012-07-31 09:43:44

+0

我知道。添加了更多的解释。希望这个帮助。 – Matthias 2012-07-31 09:48:40

相关问题