c# - 具有 2 个处理程序的事件 Func<bool> : which return to expect?

标签 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 的构造函数末尾会出现什么结果,为什么?

最佳答案

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

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

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

关于c# - 具有 2 个处理程序的事件 Func<bool> : which return to expect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22360314/

相关文章:

c# - 如何计算 SQL Server 中的多个列?

c# - 不能在同一个类中使用声明的字典?

c - C与LabVIEW的事件结构有何相似之处?

c# - 访问 GridCheckboxColumn

javascript - 如何使用事件冒泡取消

javascript - 我将如何在纯 JavaScript 中暂时禁用该事件?

c - 指针语法混淆(*ptr vs ptr)

Java lambda 表达式 - 显式目标类型

c++ - 是否有任何方法或宏来模拟语法 "if(a <= b < c <= ...)"来替换 "if(a<=b && b < c && c <= ...)"?

c# - Web 服务器在充当网关或代理服务器时收到无效响应