如果我有一个事件,其处理程序返回一个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。但是我为这个事件分配了两个处理程序......会发生什么?使用第一个处理程序的返回?第二个?都不是?既?
答案 0 :(得分:6)
总的来说,这是一个糟糕的设计。
考虑使用像CancelEventArgs这样的模式,您可以在EventArgs中嵌入返回值。这使得未来的处理程序可以检查和/或更改值。一个ref
的工作方式与passed from handler to handler相同,但IMO有点出乎意料:
当签名包含通过引用传递的参数时,参数的最终值是调用列表中每个方法顺序执行并更新参数值的结果。
但是,是的 - 在你的例子中,它是last handler called:
当委托调用的方法的签名包含返回值时,委托返回调用列表中最后一个元素的返回值。
这是guaranteed to be in the order添加的内容:
[addition]操作的结果是一个新的委托实例,在调用时,调用第一个操作数,然后调用第二个操作数
但是,因为没有处理程序知道它是第一个,中间还是最后一个 - 对我来说似乎没用。
答案 1 :(得分:4)
使用要注册的最后一个事件的返回值。