假设我有类 A
和 B
。
在 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)。即使定义了行为,大多数程序员也不知道这是做什么的,因此代码会很困惑。如果程序员认为顺序不重要(这通常是一个合理的假设),那么他们也可以更改定义处理程序的顺序。
请注意,这仅适用于未定义自己的 add
和 remove
方法的事件。自动实现会将新的处理程序组合到维护此属性的 MultiCastDelegate 中。使用自定义 add
/remove
方法的事件可以做任何它想做的事情,它可以随心所欲地触发事件,允许它做任何事情,比如例如选择要使用的不同返回值,使用所有返回值等。因此,如果在无法查看其源代码的类中看到一个事件,则无法知道是否会维护此属性。您无法知道它是否定义了自定义 add
/remove
方法。
关于c# - 具有 2 个处理程序的事件 Func<bool> : which return to expect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22360314/