2010-04-23 63 views
3

CLR via C#,傑弗裏裏希特給委託鏈的(第406)。下面的例子:委託鏈接是否必須以空委託開始?

internal delegate void Feedback(Int 32 value); 

Feedback fb1 = new Feedback(method1); // in the book, these methods 
Feedback fb2 = new Feedback(method2); // have different names 
Feedback fb3 = new Feedback(method3); 

Feedback fbChain = null; 
fbChain = (Feedback) Delegate.Combine(fbChain, fb1); 
fbChain = (Feedback) Delegate.Combine(fbChain, fb2); 
fbChain = (Feedback) Delegate.Combine(fbChain, fb3); 

爲什麼到Delegate.Combine第一次調用都在一個空Delegate通?下面是我本來以爲應該寫成:

Feedback fbChain = (Feedback) Delegate.Combine(fb1, fb2); 
fbChain = (Feedback) Delegate.Combine(fbchain, fb3); 

回答

7

正確的 - 你不必開始一個null。 Delegate.Combine所做的就是返回一個新的委託,其中第一個參數的調用列表附加了第二個參數的調用列表。如果其中一個參數爲null,則它僅返回您通過的其他代表。

此外,您不必直接使用Combine。你可以這樣做:

Feedback fbChain = method1; 
fbChain += method2; 
fbChain += method3; 

fbChain = new Feedback(method1) + new Feedback(method2) + new Feedback(method3); 

+爲代表映射到Combine。這也是編譯器的類型檢查,而不是必須使用Delegate.Combine(如果簽名不匹配,它只會在運行時失敗)

+0

+1 - 好,準確和徹底的答案 – ANeves 2010-04-23 15:35:16

2

那麼,根據definition看來你甚至可以進一步降低它:

Feedback fbChain = (Feedback) Delegate.Combine(fb1, fb2, fb3);