0

我有以下课程

儿童班:

public class ChildClass
{
   ...
   private void EventHandler(...);
   ...
}

父类:

public class ParentClass
{
   ...
   ChildClass child;
   ...
   private void EventHandler(...);
   ...
}

他们都在同一个事件上有一个事件处理程序。

问题是这些处理程序将以什么顺序被调用?

4

6 回答 6

6

重要的提示

Servy 非常正确地指出,我们不能排除相关事件由第三方拥有并且它自己实现访问器的可能性。如果是这样的话,那么所有的赌注都被取消了。

下面的原始答案默默地假设我们正在谈论一个沼泽标准,完全无趣的事件实现。

原始答案

事件是通过委托实现的。

来自MSDN

委托对象的一个​​有用属性是可以使用 + 运算符将多个对象分配给一个委托实例。多播委托包含已分配委托的列表。当调用多播委托时,它会按顺序调用列表中的委托。

因此,处理程序按照您将它们添加到事件的顺序被调用。

于 2013-03-20T13:09:26.803 回答
3

虽然 MSDN 文档明确指出多播委托按订阅顺序调用委托,但假定订阅顺序是确定的,即您处于单线程环境中。

如果不是这种情况,您最好定义两个事件:一个 BeforeEventOccurs 事件和一个 AfterEventOccurs 事件。即使在多线程环境中,这也可以让您对订单进行确定性控制。

于 2013-03-20T13:14:37.590 回答
3

订阅代表的顺序,尽管由于规范中的任何地方(我知道)都没有正确指出这是预期的行为,特别是,依赖这样的顺序可能是愚蠢的,因为它可能会随着每个实现而改变。

于 2013-03-20T13:09:07.863 回答
3

它将按照它们注册的顺序被调用。

于 2013-03-20T13:10:53.037 回答
2

根据这个问题,事件处理程序按照订阅事件的顺序被调用。

于 2013-03-20T13:09:53.193 回答
1

来自代表

委托用于将方法作为参数传递给其他方法。事件处理程序只不过是通过委托调用的方法。您创建一个自定义方法,当某个事件发生时,诸如 windows 控件之类的类可以调用您的方法。

如何:组合代表(组播代表)页面;

委托对象的一个​​有用属性是可以使用 + 运算符将多个对象分配给一个委托实例。多播委托包含已分配委托的列表。当调用多播委托时,它会按顺序调用列表中的委托。

于 2013-03-20T13:10:10.247 回答