1、什么是事件
事件是类的一种成员。负责类或对象之间的消息通知。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订阅者”。
- 发行者
定义事件成员
定义引发事件的方法(通过此方法通知事件的登记对象)
定义方法将输入转化为期望的事件(引发事件的方法) - 订阅者
注册在事件成员被触发时调用的方法 - 消息(发行者通过事件向订阅者传递的信息)
类派生自System.EventArgs
2、事件的特点
- 发行者确定何时引发事件,订户确定执行何种操作来响应该事件
- 一个事件可以有多个订户。 一个订户可处理来自多个发行者的多个事件
- 没有订户的事件永远也不会引发
- 事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作
- 如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序
- 在 .NET Framework 类库中,事件是基于EventHandler委托和EventArgs基类的
3、怎样定义一个事件程序
这是一个电子邮件到达通知的例子,当电子邮件到达时,会引发NewMail事件,而注册到这个事件上的Fax和Pager都会收到通知,并以自己的方式处理该邮件。
定义一个消息


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; }}}
发布者类


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);}}
订阅者类


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、博客园中其他资料
- 读<<CLR via C#>>总结(11) 详谈事件
- 跟小静读CLR via C#(13)-浅谈事件
- C#事件(event)解析
- C# 中的委托和事件