c#事件是一个很重要的类型。为了理解事件这个概念,先用现实当中的例子做个比喻。学校每个学院都有一个接收电子邮件的部门,我们暂时先叫它信息部门,它负责接收学校上级部门的电子邮件,并且把邮件的内容发送给学院下面的每一个专业,专业的负责人接收到邮件后再通知学生开展活动。
在这个例子中,邮件始终是整个过程当中的媒介,它用于存放所有需要发放给事件通知接收者的附加信息。按照规定,所有传递给事件处理程序的用于存放事件信息的类型应该继承自System.Eventargs,并且类的名称应该以Eventargs结束。
internal class NewMailEventArgs : EventArgs
{
private readonly string from, to, subject;
public string Subject
{
get { return subject; }
}
public string To
{
get { return to; }
}
public string From
{
get { return from; }
}
public NewMailEventArgs(string _from, string _to, string _subject)
{
this.from = _from;
this.to = _to;
this.subject = _subject;
}
}
这个例子当中,学院信息部充当了信息传递桥梁的作用
internal class InfoMananger
{
private readonly object eventLock = new object();
private EventHandler<NewMailEventArgs> m_NewMail;
public event EventHandler<NewMailEventArgs> NewMail
{
add
{
Console.WriteLine("Add");
lock (eventLock) { m_NewMail += value; }
}
remove
{
Console.WriteLine("Remove");
lock (eventLock) { m_NewMail -= value; }
}
}
public DateTime Date = DateTime.Now;
#region 定义一个方法,将输入转化为期望事件
public void SimulateNewMail(string _from, string _to, string _subject)
{
NewMailEventArgs e = new NewMailEventArgs(_from, _to, _subject);
OnNewMail(e);
}
#endregion
#region 定义一个负责印发事件的方法,来通知已订阅事件读的对象事件已发生
protected virtual void OnNewMail(NewMailEventArgs e)
{
EventHandler<NewMailEventArgs> temp = m_NewMail;
if(temp != null)
{
temp(this, e);
}
}
#endregion
}
其中 SimulateNewMail相当于学院信息部门从学校上级接收到邮件的这个过程
OnNewMail相当于学院把上级的事件发送给各个专业
下面以计算机专业为例子
internal sealed class ComputerProfessional
{
public ComputerProfessional(InfoMananger mm)
{
mm.NewMail += FaxMsg;
}
private void FaxMsg(Object sender, NewMailEventArgs e)
{
string _time = (sender as InfoMananger).Date.ToString("yyyy.MM.dd");
Console.WriteLine("Fax mail message:");
Console.WriteLine("From={0}, To={1}, Subject={2}, Date={3}", e.From, e.To, e.Subject, _time);
}
// 注销NewMail事件的订阅
public void Unregister(InfoMananger mm)
{
mm.NewMail -= FaxMsg;
}
}
构造函数中注册事件相当于计算机专业的负责人事先把自己的联系方式给学校信息部门,学校纤细本门通过这个渠道把消息传达
Unregister相当于信息办把专业负责人的联系方式删除,下次就不传达了
class Program
{
static void Main(string[] args)
{
InfoMananger mm = new InfoMananger();
ComputerProfessional fax = new ComputerProfessional(mm);
mm.SimulateNewMail("学校教务办","计算机科学与技术专业", "去教学楼领书");
}
}
Main函数演示了事件调用的整个过程。