委托链接是否必须以null Delegate开头?

时间:2010-04-23 14:28:50

标签: c# delegates

CLR via C#中,Jeffrey Richter给出了以下代理链接示例(第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);

2 个答案:

答案 0 :(得分: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(如果签名不匹配,则只会在运行时失败)

答案 1 :(得分:2)

嗯,根据definition,你似乎可以进一步减少它:

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