在CLR中通过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);
Run Code Online (Sandbox Code Playgroud)
为什么第一次调用Delegate.Combine必须传入null Delegate?以下是我认为应该写的方式:
Feedback fbChain = (Feedback) Delegate.Combine(fb1, fb2);
fbChain = (Feedback) Delegate.Combine(fbchain, fb3);
Run Code Online (Sandbox Code Playgroud)
正确 - 您不必以null开头.什么Delegate.Combine是返回一个新的委托与第一个参数的调用列表附加第二个参数的调用列表.如果其中一个参数为null,则只返回您传入的另一个委托.
此外,您不必Combine直接使用.你可以这样做:
Feedback fbChain = method1;
fbChain += method2;
fbChain += method3;
Run Code Online (Sandbox Code Playgroud)
要么
fbChain = new Feedback(method1) + new Feedback(method2) + new Feedback(method3);
Run Code Online (Sandbox Code Playgroud)
至于+代表映射到Combine.编译器也会对此进行检查,而不必使用Delegate.Combine(如果签名不匹配,则只会在运行时失败)
| 归档时间: |
|
| 查看次数: |
517 次 |
| 最近记录: |