委托的介绍
- 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态赋给参数的做法,可以避免在程序中大量使用分支语句,同时系统也有很多的拓展性
- 使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(此时说调用,是因为此变量代表一个方法),可以依次调用所有绑定的方法
事件
- 事件至于委托,类似字符串类型中字段和属性的关系
- 声明一个事件类似于声明一个进行了封装的委托类型的变量,这个变量即便被声明为public,也会被定义为private.
- 实际使用时,之所有用事件而不用委托: 主要是考虑安全性
委托、事件与Observer设计模式
委托事件的解惑
- 为什么要使用事件而不是委托变量
除了封装性、易用性考虑外,最重要的一点是:事件应该由事件发布者触发,而不应该由客户端触发
- 为什么委托定义的返回值通常都是void
- 委托变量可供多个订阅者注册,如果定义了返回值,那么多个订阅者的方法都会向发布者返回数值,后值会覆盖前值,结果只能取到最后一个方法的返回值
- 发布者和订阅者是松耦合的,发布者不关心谁订阅了他,为什么订阅,因而也不会关系订阅者的返回值
- 如何让事件只允许一个客户订阅
使用等于号赋值
- 获得多个返回值与异常处理
通过*delegate.GetInvocationList()获取订阅的方法列表,再通过向下强制转换或调用*DynamicInvoke
- 委托中订阅者方法超时的处理
使用*BeginInvoke*进行异步调用