最近做.NET实验时,老师给了份关于委托与事件的材料,于是决定总结一下自己的理解。
一、概念
事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型 (Delegate),该类型提供函数指针的功能。
委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行时提供实现。
二、举例
设计一个查找/替换对话框。
设计思路:查找/替换对话框是一类经典的对话框,在与主窗口进行交互的时候并不会自动关闭,但是针对不同的主窗口可以有不同的实现。于是,委托与事件机制就可以发挥作用了。将主窗口与对话框看作对象A与对象B,对象B的功能实现与具体的对象A有关,所以功能实现的方法必须为对象A的方法,而对象B的功能就是根据需求调用对象A的方法。
实现步骤:
(1)自定义一个事件参数(EventArgs)类型,用于存放委托调用所需的参数。
(2)根据事件参数类型,定义一个委托(delegate)类型,用于支持事件机制。
(3)在对象B中定义基于委托类型的事件(event),例如,查找对话框可以定义一个查找事件。
(4)在对象B的方法中触发事件,例如,在“查找”按钮的点击事件方法里触发查找事件。
(5)在对象A中定义具体功能实现的方法,例如,定义一个查找方法。
(6)将对象A中的方法添加到对象B中的事件,相当于对象B的查找事件订阅了对象A的查找方法。