委托
委托(delegate)是一种动态调用方法的类型,它与类、接口和数组相同,属于引用型。
在C#程序中,可以声明委托类型、创建委托的实例(即委托对象)、把方法封装于委托对象之中,这样通过该对象就可以调用方法了。一个完整的方法具有名字、返回值和参数列表,用来引用方法的委托也要求必须具有同样的参数和返回值。
因为C#允许把任何具有相同签名(相同的返回值类型和参数)的方法分配给委托变量,所以可通过编程的方式来动态更改方法调用,因此委托是实现动态调用方法的最佳办法,也是C#实现事件驱动的编程模型的主要途径。
委托对象本质上代表方法的引用(内存地址)。
在.NET Framework中,委托具有以下特点:
1、委托类似于 C++ 函数指针,但与指针不同的是,委托是完全面向对象的,是安全的数据类型。
2、委托允许将方法作为参数进行传递。
3、委托可用于定义回调方法。
4、委托可以把多个方法链接在一起。这样,在事件触发时可同时启动多个事件处理程序。
5、委托签名不需要与方法精确匹配。
多路广播与委托的组合
C#的所有委托都是隐式的多路广播委托。向一个委托的调用列表添加多个方法引用,可通过该委托一次性调用所有的方法,这一过程称为多路广播。建议在使用多路广播时,每个方法均用void定义。
事件是通过委托实现的。EventHandler是一个预定义的委托,是一个无返回值的方法。在.NET中,它的定义格式如下:
public delegate void EventHandler(Object sender,EventArgs e)
其中,第一个参数sender,类型为 Object,表示事件发布者本身。第二个参数e,用来传递事件的相关数据信息,数据类型为 EventArgs及其派生类。
实际上,标准的EventArgs并不包含任何事件数据,因此EventHandler专用于表示不生成数据的事件的事件方法。如果事件要生成数据,则必须提供自定义事件数据类型,该类型从 EventArgs 派生,提供保存事件数据所需的全部字段或属性,这样发布者可以将特定的数据发送给接收者。