C#事件和类层次结构

时间:2013-03-20 13:07:02

标签: c# events class-hierarchy

我有以下课程

儿童班:

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

家长班:

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

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

问题是这些处理程序的调用顺序是什么?

6 个答案:

答案 0 :(得分:6)

重要提示

Servy非常正确地pointed out我们不能排除有关事件由第三方拥有并且它实现accessors本身的可能性。如果是这样的话,那么所有的赌注都会被取消。

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

原始回答

事件通过delegates实施。

来自MSDN

  

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

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

答案 1 :(得分:3)

代表订阅的顺序,虽然因为在规范中我没有正确地注明(我知道)这是预期的行为,特别是那么依赖这样的顺序可能是愚蠢的,因为它可能会因实施而改变。

答案 2 :(得分:3)

它将按照注册顺序调用。

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

根据this question事件处理程序按照订阅事件的顺序调用。

答案 5 :(得分:1)

来自 Delegates

  

委托用于将方法作为参数传递给其他方法。   事件处理程序只不过是通过调用的方法   代表即可。您可以创建自定义方法和类,例如窗口   当某个事件发生时,control可以调用你的方法。

来自 How to: Combine Delegates (Multicast Delegates) 页面;

  

委托对象的一个​​有用属性是多个对象可以   使用+运算符分配给一个委托实例。该   多播委托包含已分配的委托的列表。当。。。的时候   调用多播委托,它调用列表中的委托, in   为了