对委托和事件的理解记录

这只是我的一些理解,如有指导和补充,非常欢迎

委托是一个类,一个引用类型。与其他的引用类型没有本质区别。用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();
-}
-
-

这种时候打印出来就是:
客人马上来了,下楼准备迎接
好的,我带孩子下楼
好的,妈妈,我们这就下来

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值