标签:
目录
一、事件
public event EventHandler<NewMailInfo> NewMail;
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
事件是类的成员,它的出现给类提供了一种能力—-通知其他对象发生了什么。
事件是一种特殊的委托。其他对象符合规则的方法可以注册和注销事件的关注。
二、邮件实例
需求:当收到新邮件时,同时通知转发给传真机以及其他机器,使得他们可以根据自己的方式处理新邮件
1、邮件信息类:承载邮件相关信息,继承EventArgs
public class NewMailInfo:EventArgs
{
private readonly string msg, from, to;
public string Msg { get { return msg; } }
public string From { get { return from; } }
public string To { get { return to; } }
public NewMailInfo(string _from, string _to, string _msg)
{
msg = _msg;
to = _to;
from = _from;
}
}
2、邮件管理类:负责接收新邮件,并通知注册的其他类(如:传真机、打印机等)
首先,定义一个处理新邮件方法,将相关信息赋予邮件信息承载类,并调用通知方法。
public void SimulateNewMail(string from, string to, string msg)
{
NewMailInfo e = new NewMailInfo(from, to, msg);
OnNewMail(e);
}
其次,新邮件通知功能,通知其他注册类。
public event EventHandler<NewMailInfo> NewMail;
protected virtual void OnNewMail(NewMailInfo e)
{
EventHandler<NewMailInfo> temp = System.Threading.Interlocked.CompareExchange(ref NewMail, null, null);
if (temp != null)
temp(this, e);
}
当编译器遇检测到 event 关键字时,会将事件:
public event EventHandler MsgEvent;
翻译成三部分:
1、
private EventHandler<NewMailInfo> _newmail = null;
2、
public void add_NewMail(EventHandler<NewMailInfo> value)
{
//当前委托链
EventHandler<NewMailInfo> newmail = this._newmail;
EventHandler<NewMailInfo> prevHandler;
do
{
prevHandler = newmail;
EventHandler<NewMailInfo> newHandler = (EventHandler<NewMailInfo>)Delegate.Combine(prevHandler, value);
newmail = System.Threading.Interlocked.CompareExchange(ref this._newmail, newHandler, prevHandler);
} while (newmail != prevHandler);
}
将当前的委托链备份一份。EventHandler<NewMailInfo> newmail = this._newmail;
3、类似add功能 的remove()方法。
整个邮件管理类就可以这样实现了。
public class MailManager
{
public event EventHandler<NewMailInfo> NewMail;
protected virtual void OnNewMail(NewMailInfo e)
{
EventHandler<NewMailInfo> temp = System.Threading.Interlocked.CompareExchange(ref NewMail, null, null);
if (temp != null)
temp(this, e);
}
public void SimulateNewMail(string from, string to, string msg)
{
NewMailInfo e = new NewMailInfo(from, to, msg);
OnNewMail(e);
}
}
3、其他类如何注册
public class Fax { public Fax(MailManager mm) { mm.NewMail+=FaxMsg; } public void FaxMsg(object sender, NewMailInfo e) { Console.Write(e.Msg+"【来自传真机】"); } }
当前使用+=进行注册,其实也是也是用add()方法进行注册方法引用。
三、总结
标签:
原文地址:http://www.cnblogs.com/sunchong/p/sunchong.html