这只是我的一些理解,如有指导和补充,非常欢迎
委托是一个类,一个引用类型。与其他的引用类型没有本质区别。用delegate声明时,编译器自动生成类,类的名字为委托变量名。委托可以引用实例和静态方法,· NET 的委托是类型安全的。
委托:一套模板。不过这套模板是针对方法的模板,用来执行方法的东西,模板里面主要规定的就是方法的返回值和方法中用到的参数类型。
下面是声明委托:
- Public delegate void SayHello(string Name,string Myself);
这个委托规定的返回值是Void,也就是说是无返回值的。参数类型规定的是两个,分别都是两个String类型的参数。
委托只是定义模板,是方法的抽象。具体的实现还是有方法本身的实现,调用方法的时候直接调用委托。
下面是方法具体实现的方法体:
- //这是我们想要传递的方法,它和SayHello有相同的返回值和同类型的参数(既尊重上面那个委托的模板)
- public void LiuLianToDingSen(string D,string L)
- {
- Debug.Log(D+",你好,我叫"+L);
- }
上面说过调用的时候可以直接调用委托,所以我们下面要做的就是把委托和方法建立联系。
- //我们已经声明了委托这个模板,下面我就要做的就是 初始化委托变量和委托绑定
-
- SayHello hello=new SayHello(LiuLianToDingSen);
-
-
- //回调委托方法
-
- hello(“丁森”,“榴莲”);
这个时候打印出来就是 丁森,你好,我叫榴莲
如果绑定两次就是打印两次
- SayHello hello= new SayHello(LiuLianToDingSen);
- hello += LiuLianToDingSen;
- hello("丁森", "榴莲");
这种时候打印出来就是 两遍 丁森,你好,我叫榴莲
因为我们在委托例表里面加入了两个方法,委托被调用后,列表的每个方法都会执行。这个时候我们需要注意的时候什么——判断是否为空,因为调用空委托会抛出异常的,所以我们的代码就是下面这样了
- SayHello hello= new SayHello(LiuLianToDingSen);
- hello += LiuLianToDingSen;
- if(hello!=null)
- {
- hello(“丁森”,“榴莲”);
- }
现在我们在委托列表中加入了两个方法,如果现在去掉一个方法我们就这样操作,用 “-=” 处理
- SayHello hello= new SayHello(LiuLianToDingSen);
- hello += LiuLianToDingSen;
- if(hello!=null)
- {
- hello(“丁森”,“榴莲”);
- }
- hello-=LiuLianToDingSen;
现在打印信息出来的就只有一次 丁森,你好,我叫榴莲
了解完委托,其实事件也就了解了80%了。事件可以理解为 限制的委托。前面我们可以看到委托用到了 “= ” “+=” “-+” 着三种符号来操作委托的绑定和去除,事件是不能用 “=” 这个的,事件只能用 “+=” ,“-=” 来操作。
- 事件是委托吗 ?
不是的,但是为了理解方便也是可以这样理解的。事件是是利用委托规定函数类型,方便在发布自身类中触发这些函数。
根据委托来定义的,利用委托规定函数的类型,方便触发函数。
-发布—订阅类型模式
包含委托和事件声明的类是发布器,包含事件处理的是订阅器。
发布器 : 写触发事件的条件。
订阅器 : 写处理事件的方法程序。
说事件就可以联想到发布—订阅模式
-定义一个发布器
-public class Mum
-{
-//声明一个委托
-public delegate void MumDelegate;
-//声明一个委托类型的事件
-public event MumDelegate MumEvent;
-//调用这个方法触发事件
-public void homeSay()
-{
-Debug.log("客人马上来了,下楼准备迎接");
-//触发事件
-OnWeChat();
-}
-public void OnWeChat()
-{
-if(MumEvent!=null)
-{
-MumEvent();
-}
-}
-}
-Public class Dad
-{
-//两种方式,一种是在类里面的构造器中添加事件,这样实例化的时候就添加上事件了。
-//另外一种就是在使用的时候再添加事件,根据需求自己做调整就可以
-Public Dad(Mum m)
-{
-m.MumEvent+=DadSay;
-}
-public void DadSay()
-{
-Debug.log("好的,我带孩子下楼");
-}
-}
-
-
-Public class Son
-{
-public Son(Mum m)
-{
-m.MumEvent+=SonSay;
-}
-public void SonSay()
-{
-Debug.log("好的,妈妈,我们这就下来");
-}
-}
-
-
-
-public void Start()
-{
-Mum m=new Mum();
-Dad d=new Dad(m);
-Son s=new Son(m);
-m.homeSay();
-}
-
-
这种时候打印出来就是:
客人马上来了,下楼准备迎接
好的,我带孩子下楼
好的,妈妈,我们这就下来