委托揭秘

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();

 

posted on 2017-11-19 16:59  更好の风格  阅读(136)  评论(0)    收藏  举报