您的位置:首页 > 其它

.NET学习笔记(六) ------事件

2008-05-26 13:31 155 查看
事件其实也是属于类型设计里的内容,不过因为他比较重要,也比较难理解,我就把他单独拿出来学习。

1:下面是一个我们在程序中最常见的代码:

private void button1_Click(object sender, System.EventArgs e)
// button1
// 登记方法到button对象
this.button1.Click += new System.EventHandler(this.button1_Click);

在程序中可以看到button1在设置时有这样一句话,他的基本意思就是把button1_click()方法登记到button1.Click对事件象上,这样当触发click事件时就会调用button1_click()方法。也就达到了通知的目的。其中button1.Click又是一个EventHandler类型,这是一个委托类型!什么是委托类型?

2:MSDN中对事件和委托的定义

关于委托可以看另外一篇介绍委托的 .NET学习笔记(八) ------委托(上)

事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。

在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。

委托是一个可以对方法进行引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。

3:事件完整的例子

下面是一个完整的例子,一个邮件接受类MailManager,当接受到邮件的时候,就会通知Fax类,Fax就回进行一些操作。2个类型在后面简单的称为A,B。

//A:
class MailManager

A这个类型是一个事件的发送方,其中定义了事件成员和其他一些方法。他就相当于前面说到的button类,当这个类型中的事件被触发是,他就通过委托来通知登记的对象。

class Fax
//1:构造一个委托字段
private MailMsgEventHandler MailMsg = null;

//2:向这个委托链表上添加委托对象
private add_MailMsg(MailMsgEventHandler handler)

//3:从这个委托链表上移除委托对象
private remove_MailMsg(MailMsgEventHandler handler)

mm.MailMsg +=new MailManager.MailMsgEventHandler(FaxMsg);

mm.MailMsg -=new MailManager.MailMsgEventHandler(FaxMsg);

因为C#编译器对事件提供了内置支持,所以会自动把他转换为上面的add和remove方法。对于那些不支持+=,-=的语言,可以直接调用上面的构造方法。而C#中则要求我们使用这2个操作符,而不允许直接调用方法。

最后要注意的是,只要一个对象仍然登记有另一个对象的事件,该对象就不可能执行垃圾收集。如果我们的类型实现了IDisposable接口的Dispose方法,,我们应该在内部注销其登记的所有事件。

6:显式的构造委托成员

以上演示的是在自定义的类中来定义和使用事件。可以发现,其中最重要的就是通过定义一个委托类型的事件成员把发送和接受者连接起来。上面也谈到了事件成员的3个构造方法。

但在.NET的设计中,控件的事件非常多,如果每个时间都自动生成这3个构造函数,那么会是非常的庞大的代码。这里简单介绍下显式的构造委托成员。

(待继)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: