首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加EventHandler += EventHandler的效果是什么?

添加EventHandler += EventHandler的效果是什么?
EN

Stack Overflow用户
提问于 2011-07-08 10:12:37
回答 3查看 374关注 0票数 3

我在A类中有一个SelectionChanged事件,我想通过B类来传递它。我假设在B类中声明一个SelectionChanged事件并将这个EventHandler分配给A.SelectionChanged会导致B.SelectionChanged在触发A.SelectionChanged时触发--结果证明这是错误的。

更清楚的是,一些代码:

代码语言:javascript
复制
class A
{
   public event EventHandler SelectionChanged;

   public void TriggerSelectionChanged()
   {
      if (SelectionChanged != null) SelectionChanged(this, EventArgs.Empty);
   }
}

class B
{
   private A _a = new A();

   public A A { get { return _a; } }

   public event EventHandler SelectionChanged;

   public B()
   {
      A.SelectionChanged += SelectionChanged;
   }

   public static void Test()
   {
      B relayer = new B();
      bool wasRelayed = false;
      relayer.SelectionChanged += delegate { wasRelayed = true; };
      relayer.A.TriggerSelectionChanged();

      System.Console.WriteLine("Relayed: {0}", wasRelayed);
   }
}

这个打印出来的是“中继:假”。

将EventHandler添加到另一个EventHandler有什么影响?

编辑:备注!我知道这方面的一个解决方案是通过委托、函数等来传递事件,但我主要是通过了解这段代码的效果来实现的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-08 11:06:31

事实证明,这是EventHandler作为一名代表所产生的效果。这个类通过(或者我假设的)使用+=实现操作符Delegate.Combine。此函数的文档如下

连接指定的多播(可组合)委托的调用列表。

所发生的情况是,分配给右侧EventHandler的所有处理程序都添加到左边的EventHandler中。在这种情况下,没有处理程序,所以什么都不会发生。但是,如果更改了事情的顺序,使B.SelectionChangedB.SelectionChanged连接到A.SelectionChanged之前被分配,那么就可以正确地将事物连接起来。但是,从B中移除处理程序并不能从A中删除它,因此这样做应该受到高度攻击。

票数 1
EN

Stack Overflow用户

发布于 2011-07-08 10:16:10

您的代码中没有任何东西可以将B.SelectionChanged的调用“连接”到A.SelectionChanged。因此,当在SelectionChanged上触发A时,不会调用处理B上的SelectionChanged的委托。

我认为您希望B上的事件在A公开的事件上充当适配器?如果是这样的话,您将需要编写自己的add / remove逻辑。见以下内容:

事件+适配器模式

另一个添加/删除的示例:

C#:具有外植性的事件添加/删除!=典型事件?

票数 2
EN

Stack Overflow用户

发布于 2011-07-08 10:17:03

在这种情况下,B的SelectionChanged和A的SelectionChanged是不相关的。

如果您要使B从A继承并删除B上的第二个声明,那么这将有效。

代码语言:javascript
复制
class A
{
   public EventHandler SelectionChanged;

   public void TriggerSelectionChanged()
   {
      if (SelectionChanged != null) SelectionChanged(this, EventArgs.Empty);
   }
}

class B : A
{
   public static void Test()
   {
      B relayer = new B();
      bool wasRelayed = false;
      relayer.SelectionChanged += delegate { wasRelayed = true; };
      relayer.TriggerSelectionChanged();

      System.Console.WriteLine("Relayed: {0}", wasRelayed);
   }
}

或者你可以通过.

代码语言:javascript
复制
class A
{
   public EventHandler SelectionChanged;

   public void TriggerSelectionChanged()
   {
      if (SelectionChanged != null) SelectionChanged(this, EventArgs.Empty);
   }
}

class B
{
   public B()
   {
     this._a.SelectionChanged += (o, s) => 
     {
       if(this.SelectionChanged != null) { this.SelectionChange(o, s); }
     };
   }




private A _a = new A();

   public A A { get { return _a; } }

   public EventHandler SelectionChanged;

   public static void Test()
   {
      B relayer = new B();
      bool wasRelayed = false;
      relayer.SelectionChanged += delegate { wasRelayed = true; };
      relayer.A.TriggerSelectionChanged();
      System.Console.WriteLine("Relayed: {0}", wasRelayed);
   }

}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6623004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档