C# 事件函数<;布尔>;使用2个处理程序:期望哪个返回?

C# 事件函数<;布尔>;使用2个处理程序:期望哪个返回?,c#,events,syntax,event-handling,func,C#,Events,Syntax,Event Handling,Func,让我们假设我有类A和B 在类A中,我有以下事件: public event Func<bool> 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() { re

让我们假设我有类
A
B

在类
A
中,我有以下事件:

public event Func<bool> 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
的构造函数结束时会出现什么结果,以及为什么?

调用多播委托将始终返回委托中最后一个方法的返回值。

在您的情况下,这将是
false

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

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

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

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;
}