您的位置:首页 > 编程语言 > C#

《CLR via C#》读书笔记 之 事件

2013-02-27 11:07 155 查看

第十一章 事件

2013-02-27

11.1 设计要公开事件的类型
11.3 设计侦听事件的类型
11.4客户端操作

ToDo: 用uml把类的关系画出来

为了帮助理解事件如何工作,先描述一个和事件相关的场景。假定现在要设计一个电子邮件系统,它的功能是:当邮件到达时,用户可以设置将邮件发送给传真机或寻呼机。

11.1 设计要公开事件的类型

返回

第一步:定义一个类型来容纳发送给事件通知者的信息

第二步:定义事件成员

第三步:定义一个负责引发事件的方法,它通知已登记对象

第四步:定义方法将输入转化为期望事件

//step1:定义一个类型来容纳发送给事件通知者的信息
class NewMailEventArgs : EventArgs
{
private readonly String m_from, m_to, m_subject;
public String From { get { return m_from; } }
public String To { get { return m_to; } }
public String Subject { get { return m_subject; } }

public NewMailEventArgs(String from, String to, String subject)
{
m_from = from; m_to = to; m_subject = subject;
}
}

class MailManager
{
//step2: 定义事件成员
public event EventHandler<NewMailEventArgs> NewMail;

//step3:定义一个负责引发事件的方法,它通知已登记对象
protected virtual void OnNewMail(NewMailEventArgs e)
{
//// .net framework最初发表时引发事件方式
//if (NewMail != null) NewMail(this, e);

//定义方法将输入转化为期望事件
EventHandler<NewMailEventArgs> temp = System.Threading.Interlocked.CompareExchange(ref NewMail, null, null);
//任何方法登记了对事件的关注,通知他们
if (temp != null) temp(this, e);
}

//step4:定义方法将输入转化为期望事件
public void SimulateNewMail(String from, String to, String subject)
{
NewMailEventArgs e = new NewMailEventArgs(from, to, subject);
OnNewMail(e);
}
}


11.3 设计侦听事件的类型

返回

class Fax
{
public Fax(MailManager mm)
{
mm.NewMail += FaxMsg;
}

private void FaxMsg(Object sender, NewMailEventArgs e)
{
Console.WriteLine("Faxing mail message:");
Console.WriteLine("   From={0}, To={1}, Subject={2}", e.From, e.To, e.Subject);
}

public void Unregister(MailManager mm)
{
mm.NewMail -= FaxMsg;
}
}


11.4客户端操作

返回

static void Main(string[] args)
{
MailManager manager = new MailManager();
Fax fax = new Fax(manager);
manager.SimulateNewMail("北京", "上海", "通知");
fax.Unregister(manager);
manager.SimulateNewMail("上海", "北京", "通知");
Console.Read();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: