第十一讲 深入“委托和事件”
*委托的定义
委托是一种引用方法的类型。一量为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其
他任何方法一样,具有参数和返回值。
*委托与C++函数指针区别
一个delegate object 一次可以搭载多个方法,而不是一次一个。当我们唤起一个搭载了多个方法的delegate,所有方
法以其“被搭载到delegate object 的顺序”被依次唤起
一个delegate object 所搭载的方法并不需要属于同一个类。一个delegate object 所搭载的所有方法必须具有相同的
原型和形式。然而,这些方法可以既有static也有non-static,可以由一个或多个不同类的成员组成。
一个delegate type的声明在本质上是创建了一个新的subtype instance,该subtype派生自.NET library framework 的
abstract base classes Delegate或MulticasDelegate,它们提供了一组public methods用以询访delegate object或其
搭载的方法。
*委托喻晖的理解
委托是函数的封装,它代表一“类”函数。它们都符合一定的签名:拥有相同的参数列表、返回值类型。同时,委托也
可以看成是函数的抽象,是函数的“类”。此时,委托的实例将代表一个具体的函数。
*为什么要使用委托?
更加灵活的方法调用。
用于异步回调。
多线程编程中使用委托来指定启动一个线程时调用的方法。
C#中的事件模型。用它们指明处理给定事件的方法。
*委托应用--异步回调
异步回调:由于实例化委托是一个对象,所以可以将其作为参数进行传递,也可以将其赋值给属性。这样,方法便可以
将一个委托作为参数来接受,并且以后可以调用该委托。这称为异步回调,是在较长的进程完成后用来通知调用方的常
用方法。以这种方式使用委托时,使用委托的代码无需了解有关所有方法的实现方面的任何信息。
*何时委托?何时接口?
在以下情况中使用委托:
当使用事件设计模式时。
当封装静态方法可取时。
当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。
需要方便的组合。
当类可能需要该方法的多个实现时。
在以下情况中使用接口:
当存在一组可能被调用的相关方法时。
当类只需要方法的单个实现时。
当使用接口的类想要将该接口强制转换为其他接口或类类型时。
*多播委托
多播委托--引用多个方法的委托,它连续调用每个方法。委托必须是同类型的,返回类型必须是void,不能带输出参数(可以带引用参数)。多播委托应用于事件模型中。