具有 2 个处理程序的事件 Func<bool>:哪个返回符合预期?

Gui*_*rme 4 c# syntax events func event-handling

假设我有课程AB

在课堂上A,我发生了以下事件:

public event Func<bool> MyEvent;
Run Code Online (Sandbox Code Playgroud)

以及以下方法:

public bool GetResult()
{
    return MyEvent();
}
Run Code Online (Sandbox Code Playgroud)

在类中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;
}
Run Code Online (Sandbox Code Playgroud)

那么, class 的构造函数末尾会出现什么结果B,为什么?

Ser*_*rvy 6

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

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

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