2015-02-11 64 views
0

下面的代碼結合代表

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

返回3,因爲只有最新添加的拉姆達正在處理 - 以前的方法被忽略。在Action<>的情況下,正在處理所有方法。

問題:是否有用於「添加」/ Delegate.Combine Funcs的用例,當每次添加另一個委託時都會覆蓋前一個?

+1

你可以通過DoWork = y => DoWork(y)+ 1來將當前的DoWork封裝在一個新的labmda中,而這個新的labwork又成爲了新的DoWork。 – SimpleVar 2015-02-11 13:18:00

回答

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 

最常見的使用情況下,可能使用多個事件處理程序訂閱同一事件將打印。

+0

@fubo如果你想閱讀更多,我建議閱讀[代表和活動](http://csharpindepth.com/Articles/chapter2/events.aspx)。 – sloth 2015-02-11 13:27:11