以下代码
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的用例,当我每次添加其他代表时都会覆盖之前的那些?
答案 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
最常见的用例可能是使用订阅同一事件的多个事件处理程序。