结合代表

时间:2015-02-11 13:10:20

标签: c# delegates

以下代码

Func<int, int> DoWork;
DoWork = x => x + 5;  // ignored
DoWork += y => y + 1; // used
Console.WriteLine(DoWork(2)); // 2 + 1 = 3

返回3,因为只处理了最新添加的lambda - 以前的方法被忽略了。如果是Action<>,则正在处理所有方法。

问题:是否有“添加”/ Delegate.Combine Funcs的用例,当我每次添加其他代表时都会覆盖之前的那些?

1 个答案:

答案 0 :(得分:6)

“以前的”不会被覆盖。它们都将被调用,但只返回最后一个的返回值。

C#规范(15.4委托调用)解释了它:

  

如果委托调用包含输出参数或返回值,则它们的最终值将来自列表中最后一个委托的调用。


要测试它,请尝试以下方法:

DoWork = x => { Console.WriteLine(x + 5); return x + 5; };
DoWork += y => { Console.WriteLine(y + 1); return y + 1; };

Console.WriteLine(DoWork(2)); // 2 + 1 = 3

会打印

7
3
3

最常见的用例可能是使用订阅同一事件的多个事件处理程序。