前辈经典文章:C#中的委托和事件
C#中的委托和事件(续)
浅谈委托和事件(一)
委托 和 事件 在.Net Framework应用广泛。我们从什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义 角度来分析。
什么是委托:
委托是一种调用回调方法,类似C中的指针。
委托delegate 是一个类,当创建实例时需要传入方法名称,每个委托都有一个签名:
签名:delegate int DelegateDemo(string s);
创建代理实例时,要传入一个方法名作为构造函数,这个方法必须满足对应的委托签名的特征:
实例化:
定义方法 private static int Function(stirng s){} ; 实例化委托:DelegateDemo dd = new DelegateDemo(Function);
调用:dd(" this is a delegate");
小结:1、这里委托delegate是一个类,它定义了方法的类型,使得可以将方法作为另一个方法的参数进行传递,可以避免大量的if else的使用,提高了代码的扩展性;
2、使用委托可以将多个相同的方法绑定到同一个委托变量上,当调用此变量时,可以依次调用所有绑定的方法;
什么是事件:事件是类似声明了一个进行了封装的委托类型的变量。
委托和事件的区别:
1、事件我们只能使用 +=、-=,不能用=进行来赋值,限制了用户直接操作委托的权限;
2、对照字段和属性,委托和事件似乎也是如此,它是对委托实例的一层封装,使客户端不能随意更改、重置内部的委托列表,只能增加和移除,使代码有更好的封装性;
Observer:Subject(被观察者)Observer(观察者)
设计模式是为了定义对象间的一种一对多的依赖关系,以便一个对象状态发生改变时,其他依赖于它的对象会被告知和更新,松耦合的设计模式;
.Net Framework 中的委托和事件:参考规范
.Net Framework的编码规范:
- 委托类型的名称都应该以EventHandler结束。
- 委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
- 事件的命名为 委托去掉 EventHandler之后剩余的部分。
- 继承自EventArgs的类型应该以EventArgs结尾。
再做一下说明:
- 委托声明原型中的Object类型的参数代表了Subject,也就是监视对象。
- EventArgs 对象包含了Observer所感兴趣的数据,在本例中是temperature。
上面这些其实不仅仅是为了编码规范而已,这样也使得程序有更大的灵活性。