委托链必须以空委托开始吗?(关于IT技术的问题)

3

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必须传递null Delegate?这是我认为应该编写的方式:
Feedback fbChain = (Feedback) Delegate.Combine(fb1, fb2);
fbChain = (Feedback) Delegate.Combine(fbchain, fb3);
2个回答

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(如果签名不匹配,则仅在运行时失败)。


2

根据定义,看起来你甚至可以进一步缩小它:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接