1.对于事件,熟悉observer模式的朋友应该很容易理解。实际上,使用事件所起到的作用也是类似的,是为了让应用程序中的一个或多个对象,能够以回调的方式,接收关于某个事件的通知。
2.实现一个自定义事件
(1) 监听对象的设计
作为监听对象listener,一定要实现一个特定的函数如下:
public void _Func(Object sender, MailEventArgs e);
其中,_Func并不是固定的,有点类似于C中对于函数指针的要求,只要求返回值和参数是一样的。
(2)写一个统一的处理模块,在其中加入事件委托对象
public event EventHandler<EventArgs> AllEventType;
需要注意的是,<>中也可以填入EventArgs的派生类的类型,这个派生类可以放置一些额外信息,供事件发生时使用。
(3)创建监听对象的同时,将监听对象的回调方法注册到事件委托对象中
AllEventType += listener._Func
(4)事件发生时,通知所有监听者(通过调用已注册回调方法的方式)
AllEventType (this, e); //这里的e即EventArgs或其派生类的实例
3.示例代码
class Fax
{
public Fax(int id)
{
m_id = id;
}
private int m_id = 0;
public void Msg(Object sender, MailEventArgs e)
{
Console.WriteLine("Fax {0} called, from {1}, to {2}", this.m_id, e.From, e.To);
}
}
internal class MailEventArgs : EventArgs
{
public MailEventArgs(string from, string to)
{
From = from;
To = to;
}
//其实应该用accessor,懒了
public string From;
public string To;
}
class MailManager
{
public void NewMail(MailEventArgs arg)
{
AllMailType(this, arg);
}
public event EventHandler<MailEventArgs> AllMailType;
}
class Program
{
static void Main(string[] args)
{
MailManager mam = new MailManager();
Fax a = new Fax(1);
//多次注册,因此可以在事件发生时,发现调用了多次回调
mam.AllMailType += a.Msg;
mam.AllMailType += a.Msg;
mam.AllMailType += a.Msg;
mam.AllMailType += a.Msg;
//事件发生了
mam.NewMail(new MailEventArgs("Shanghai", "Beijing"));
}
}
4.
参考自 CLR via C#