4
执行事件时,可以提供代码add
和remove
事件处理程序。然而,事件可以通过三种方式获得:为什么事件不提供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(...)
方法。但有两次与该方法重要的缺点:
- 事件代码分散 - >组织化程度较低的代码库
- 你不能简单的重构事件(例如,将其重命名)
编辑:很明显,编译器团队已经为此功能而设计(请参阅GetRaiseMethod()
)。
你是什么意思的“自己”? – Matthias 2012-07-31 09:41:18
如果你可以去做'button1.Click(...)',那么它会引发事件,而不会被按钮本身触发。只有Button类应该能够引发事件。这就是为什么你可以在定义它的类中调用它,但不能以其他方式调用它。 – Lucero 2012-07-31 09:43:44
我知道。添加了更多的解释。希望这个帮助。 – Matthias 2012-07-31 09:48:40