繁体   English   中英

C#事件和类层次结构

[英]C# events and class hierachy

我有以下课程

子班:

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

家长班:

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

两者都具有针对同一事件的事件处理程序。

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

重要的提示

Servy非常正确地指出 ,我们不能排除相关事件由第三方拥有并且实现访问器本身的可能性。 如果真是这样,那么所有的选择都将关闭。

下面的原始答案默默假设我们正在讨论沼泽标准的,完全没有意思的事件实现。

原始答案

活动是通过代表实施的。

MSDN

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

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

委托的订阅顺序,尽管由于规范中的任何地方(据我所知)都没有适当地指出这是预期的行为,但是,依靠这种顺序可能是愚蠢的,因为每个实现可能会改变。

它将被注册为int。

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

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

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

来自代表

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

如何:合并代理(多播代理)页面;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM