1、什么是事件
事件是类的一种成员。负责类或对象之间的消息通知。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订阅者”。
- 发行者
定义事件成员
定义引发事件的方法(通过此方法通知事件的登记对象)
定义方法将输入转化为期望的事件(引发事件的方法) - 订阅者
注册在事件成员被触发时调用的方法 - 消息(发行者通过事件向订阅者传递的信息)
类派生自System.EventArgs
2、事件的特点
- 发行者确定何时引发事件,订户确定执行何种操作来响应该事件
- 一个事件可以有多个订户。 一个订户可处理来自多个发行者的多个事件
- 没有订户的事件永远也不会引发
- 事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作
- 如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序
- 在 .NET Framework 类库中,事件是基于EventHandler委托和EventArgs基类的
3、怎样定义一个事件程序
这是一个电子邮件到达通知的例子,当电子邮件到达时,会引发NewMail事件,而注册到这个事件上的Fax和Pager都会收到通知,并以自己的方式处理该邮件。
定义一个消息
View Code
public class NewMailEventArgs:EventArgs { private readonly string m_from, m_to, m_subject; public NewMailEventArgs(string From,string To,string Subject) { m_from = From; m_to = To; m_subject = Subject; } public string From { get { return m_from; } } public string To { get { return m_to; } } public string Subject { get { return m_subject; } } }
发布者类
View Code
public class MailManger { /// <summary> /// 定义事件成员 /// </summary> public event EventHandler<NewMailEventArgs> NewMail; /// <summary> /// 定义引发事件的方法(通过此方法通知事件的登记对象) /// </summary> /// <param name="e">传递的信息</param> protected virtual void OnNewMail(NewMailEventArgs e) { if (NewMail!=null) { NewMail(this, e); } } /// <summary> /// 定义方法将输入转化为期望的事件(引发事件的方法) /// </summary> /// <param name="from"></param> /// <param name="to"></param> /// <param name="subject"></param> public void SimulateNewMail(string from, string to, string subject) { NewMailEventArgs e = new NewMailEventArgs(from, to, subject); OnNewMail(e); } }
订阅者类
View Code
internal sealed class Pager { public Pager(MailManger mm) { mm.NewMail += new EventHandler<NewMailEventArgs>(mm_NewMail); } public void Unregister(MailManger mm) { mm.NewMail -= new EventHandler<NewMailEventArgs>(mm_NewMail); } void mm_NewMail(object sender, NewMailEventArgs e) { Console.WriteLine("Pager mail message:"); Console.WriteLine(" From={0}, To={1}, Subject={2}", e.From, e.To, e.Subject); } } internal sealed class Fax { public Fax(MailManger mm) { mm.NewMail += new EventHandler<NewMailEventArgs>(mm_NewMail); } void mm_NewMail(object sender, NewMailEventArgs e) { Console.WriteLine("Faxing mail message:"); Console.WriteLine(" From={0}, To={1}, Subject={2}", e.From, e.To, e.Subject); } }
程序输出结果
4、博客园中其他资料