事件Func <bool>有2个处理程序:返回期望?</bool>

时间:2014-03-12 18:13:38

标签: c# events syntax event-handling func

假设我有课程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类的构造函数结束时会出现什么结果?为什么?

2 个答案:

答案 0 :(得分:2)

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

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

请注意,这仅适用于未定义自己的addremove方法的事件。自动实现将新的处理程序组合到MultiCastDelegate中,后者维护此属性。使用自定义add / remove方法的事件可以执行任何操作,并且可以根据需要触发事件,允许它执行任意数量的操作,例如选择不同的返回值使用,使用所有返回值等。因此,如果在类中看到无法查看源代码的事件,则无法知道是否将维护此属性。您无法知道它是否定义了自定义add / remove方法。

答案 1 :(得分:1)

调用多播委托将始终返回委托中最后一个方法的返回值 在您的情况下,那将是false