C#委托和事件

我需要开发一个报警系统,老大提示了需要用到“事件”这个概念。

于是我查找了相关资料,发现C#的“事件”概念是建立于委托和事件上的,进而衍生出Observer设计模式。

这里我先谈一下我对委托和事件的理解,在C#中它们其实就是对应了两个关键字“delegate”和“event”。


1)委托

首先看几个常见的函数签名:

public void GetChineseName(string name);
public void GetEnglishName(string name);

可以看出,上述两个函数只有名称上的不同,当我们在定义变量时,诸如:string name1;string name2;时,变量name1,name2也只是名称上的不同,但是都属于string类型。那么是否可以用某个类似“string”的类型,定义不同名称的“函数变量”呢?有了delegate就可以。

public delegate void GetNameDelegate(string name);
比较这个定义与上前面的函数签名,只是多了一个delegate关键字,这里即使用了delegate关键字创造了一个委托类型,名称是GetNameDelegate,等同于String。

正如String定义字符串类型,委托定义了“函数类型”。接下来就可以利用GetNameDelegate干与String类似的事了。注意有一点不同是,同一个委托变量可以绑定多个函数。

GetNameDelegate myDelegate = new GetNameDelegate(GetChineseName);
myDelegate += GetEnglishName;

当然,也可以这么用:

GetNameDelegate myDelegate;
myDelegate = GetChineseName;
myDelegate += GetEnglishName;
是不是很类似我们平时定义变量的感觉?注意,第一次绑定函数时候,必须用“=”,之后如需绑定多个函数,用“+=”。这样很别扭,使用之后的事件即可避免这种情况。

这样利用语句:
myDelegate("Yis");
会先后调用public void GetChineseName("Yis")和public void GetEnglishName("Yis")两个方法。


因此,委托定义函数的类型,方便我们将一个函数作为另一个函数的参数传递进去。

使用委托可以将多个仅不同名称的函数绑定到同一个变量,调用(这里用“调用”这个词,是因为此变量代表一个方法)变量时可以依次调用所有绑定的方法。


2)事件

事件就是封装了委托类型的变量,就如同在类中封装string类型时用属性,那封装delegate类型时就用事件。而且统统利用“+=/-=”绑定/解绑函数,利用event关键字:

public event myDelegate makeDelegate;
事件将原来的委托变量myDelegate封装成一个新的委托变量makeDelegate,它总是private,我们就可以这么干了

makeDelegate += GetChineseName;
makeDelegate += GetEnglishName;
注意都是用的“+=”,这样利用语句:
makeDelegate("Yis");
依然会先后调用public void GetChineseName("Yis")和public void GetEnglishName("Yis")两个方法。



Observer设计模式就应用了委托与事件,还有待我继续研究哟。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值