事件Func< bool>使用2个处理程序:返回到expect

本文关键字:程序 返回 expect 处理 2个 Func bool 使用 事件 | 更新日期: 2023-09-27 17:49:54

假设我有AB两个类。

A类中,我有以下事件:

public event Func<bool> MyEvent;

和以下方法:

public bool GetResult()
{
    return MyEvent();
}

B类中,我有以下构造函数:

public B()
{
    A a = new A();
    a.MyEvent += a_MyEvent_one;
    a.MyEvent += a_MyEvent_two;
    bool result = a.GetResult();
}
private bool a_MyEvent_one()
{
    return true;
}
private bool a_MyEvent_two()
{
    return false;
}

那么,在类B的构造函数的末尾期望得到什么结果,为什么?

事件Func< bool>使用2个处理程序:返回到expect

您将获得最近添加的句柄的结果。

话虽如此,你不应该依赖这种行为。这就是为什么事件在概念上不应该使用带有返回值的委托。即使定义了行为,大多数程序员也不会意识到它的作用,因此代码会令人困惑。如果程序员期望处理程序的顺序不重要(这通常是一个合理的假设),他们也可以更改处理程序定义的顺序。

注意,这只适用于没有定义自己的addremove方法的事件。自动实现将把新的处理程序组合到维护此属性的MultiCastDelegate中。使用自定义add/remove方法的事件可以做任何它想做的事情,并且它可以按照它想要的方式触发事件,允许它潜在地做任何数量的事情,例如选择使用不同的返回值,使用所有返回值等。因此,如果在类中看到无法查看其源代码的事件,则无法知道是否将维护此属性。您无法知道它是否定义了自定义add/remove方法。

调用多播委托将始终返回委托中最后一个方法的返回值。
在您的示例中,它将是false