在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);
答案 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);