每个返回值的事件的.Net多事件处理程序

时间:2009-05-08 22:41:54

标签: .net event-handling

如果我有一个事件,其处理程序返回一个bool,如果我附加多个事件会发生什么?

见这个例子

public class MyClass
{
 public delegate bool MyEventHandler(object sender, EventArgs e);
 public event MyEventHandler Submit;

 public void DoSubmissions()
 {
  if (Submit != null && Submit(this, null))
  {
   Console.Write("HOORAY");
  }
 }
}

所以在我的例子中,处理程序在成功提交时返回true。但是我为这个事件分配了两个处理程序......会发生什么?使用第一个处理程序的返回?第二个?都不是?既?

2 个答案:

答案 0 :(得分:6)

总的来说,这是一个糟糕的设计。

考虑使用像CancelEventArgs这样的模式,您可以在EventArgs中嵌入返回值。这使得未来的处理程序可以检查和/或更改值。一个ref的工作方式与passed from handler to handler相同,但IMO有点出乎意料:

  

当签名包含通过引用传递的参数时,参数的最终值是调用列表中每个方法顺序执行并更新参数值的结果。

但是,是的 - 在你的例子中,它是last handler called

  

当委托调用的方法的签名包含返回值时,委托返回调用列表中最后一个元素的返回值。

这是guaranteed to be in the order添加的内容:

  

[addition]操作的结果是一个新的委托实例,在调用时,调用第一个操作数,然后调用第二个操作数

但是,因为没有处理程序知道它是第一个,中间还是最后一个 - 对我来说似乎没用。

答案 1 :(得分:4)

使用要注册的最后一个事件的返回值。