我需要开发一个报警系统,老大提示了需要用到“事件”这个概念。
于是我查找了相关资料,发现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设计模式就应用了委托与事件,还有待我继续研究哟。