委托揭秘
1.委托的本质:
编辑器实际会像下面这样完整定义一个类
1.该类访问类型是private ,如果源代码该使用public,编译成的Feedback也会变成公共类。
2.所有的委托类型都派生自MulticastDelegate,所以它们继承了MulticastDelegate的字段、属性和方法,有三个非公共字段是非常重要的。如下图
具体例子:
2.委托链
下面介绍委托链:
Delegate.Combine(Delegate a, Delegate b) 将a,b两个委托实例合并在一个一个委托实例中,返回Delegate。 如下例:
// 声明
public delegate void Callback ();
Callback fbChain= null;
Callback fb1= new Callback(FeedbackToConsole);
Callback fb2= new Callback(FeedbackToMsgBox);
Callback fb3= new Callback(FeedbackToFile);
//合并
fbChain = Delegate.Combine(fbChain,fb1) ;
fbChain = Delegate.Combine(fbChain,fb2) ;
fbChain = Delegate.Combine(fbChain,fb3) ; // 同理
最终状态:
可以查看委托里面的委托链
3.C#为委托提供了简化语法
到现在来看这些Combine,Invoke这些接口在实际操作中几乎没用到。那是因为C#为委托提供了简化语法。而我们平时用的就是简化语法。
Callback fbChain= null;
Callback fb1= new Callback(FeedbackToConsole);
fbChain = Delegate.Combine(fbChain,fb1) ;
等价于
Callback fbChain= null;
fbChain += fb1;
fbChain.invoke();
等价于fbChain();