【问题标题】:C# events and class hierachyC# 事件和类层次结构
【发布时间】:2013-03-20 13:07:01
【问题描述】:

我有以下课程

儿童班:

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

父类:

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

它们都对同一个事件有一个事件处理程序。

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

【问题讨论】:

  • 您在哪里将事件处理程序连接到事件?
  • @Nick 两个班级都在挂钩这个事件。
  • 用你的调试器找出来怎么样?
  • 跟我问的不太一样……
  • @UweKeim:使用调试器,您可以了解当前实现的发生了什么。参考文档,您可以了解什么是保证行为。

标签: c# events class-hierarchy


【解决方案1】:

重要提示

Servy 非常正确地拥有pointed out,我们不能排除相关事件由第三方拥有并且它自己实现accessors 的可能性。如果是这样,那么所有的赌注都没有了。

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

原答案

事件通过delegates实现。

来自MSDN

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

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

【讨论】:

  • 事件可以通过委托来实现,但是没有任何强制事件需要通过委托来实现。对于未通过委托实现的事件,调用顺序可能完全不同。
【解决方案2】:

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

【讨论】:

  • 这在文档中有说明,所以它肯定不会改变——至少不会超过例如微软可以决定从明天开始,(把你喜欢的方法放在这里)将以不同的顺序接受它的论点。全球范围内以前工作代码的即时破坏 = 如果完全可以避免,您就不会这样做。
  • @Jon 除非一组事物被明确记录为可靠、可预测的顺序,否则它是不可信的;事实上,这在您的回答中已提及,因此风险很小(在 MS 实施中),但这种 的期望之前已经知道会刺痛人们。
  • 我的意思是它明确记录的。如果您知道处理程序的连接顺序,那么您也知道它们将被调用的顺序。
  • 分为两部分:a) events are implemented with delegates,b) 唯一可以在生成的多播委托中“添加”委托explicitly specifies 的方法。如果某人(例如 Mono)的做法不同,那么他们的实现显然不符合要求。
  • @Jon 假设事件使用多播委托作为后备存储。如果事件不使用内置的添加/删除方法而是提供它自己的方法,它可以使用它想要的任何存储机制,它可能会或可能不会保持相同的顺序。由于这是一个 event 而不是 delegate 调用的顺序实际上可以改变而无需更改语言规范或实现,只需修改其定义类。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    如果不是这样,您最好定义两个事件:一个 BeforeEventOccurs 事件和一个 AfterEventOccurs 事件。即使在多线程环境中,这也能让您对顺序进行确定性控制。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        来自Delegates

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多