CLR via C# 事件

事件,定义了事件成员的类型允许类型(或类型的实例)通知其他对象发生了特定的事情。

例如,Button提供了OnClick事件。

具体的说,定义了事件成员的类型能提供以下功能:

1.方法能登记它对事件的关注。

2.方法能注销它对事件的关注。

3.事件发生时,登记了的方法将收到通知。

//--

类型之所以能提供事件通知功能,是因为类型维护了一个已登记方法的列表。事件发生后,类型将通知列表中所有已登记的方法。

CLR事件模型以委托为基础。委托是调用回调方法的一种类型安全的方式。对象凭借回调方法接收它们订阅的通知。

//--

现在假定设计一个电子邮件程序。当电子邮件到达时,用户可能希望将该邮件转发传真机。

先设计MailManager的类型来接收传入的电子邮件,它公开NewMail事件。

其他类型(如Fax)的对象登记对于该事件的关注。MailManager收到新电子邮件会引发该事件,造成邮件分发给每个已登记的对象。每个对象都有它们自己的方式处理邮件。

应用程序初始化时只实例化一个MailManager实例,然后可以实例化任意数量的Fax对象。

//--设计要公开的事件的类型

第一步:定义类型来容纳所有需要发送给事件通知接收者的附加信息。

事件引发时,引发事件的对象可能希望向接收事件通知的对象传递一些附加信息。这些附加信息需要封装到它自己的类中,该类型通常包含一组私有字段,以及一些用于公开这些字段的只读公共属性。根据约定这种类应该从System.EventArgs派生。而且类名以EventArgs结束。

第二步,定义事件成员

事件成员使用C#关键字event定义。每个事件成员都要指定一下内容:可访问性标识符(几乎肯定是public,这样其他代码才能访问该事件成员);委托类型,指出要调用的方法的原型;以及名称(可以是任何有效的标识符)。

其中,NewMail是事件名称。事件成员的类型时EventHandler<NewMailEventArgs>,这意味着“事件通知”的所有接收者都必须提供一个原型和EventHandler<NewMailEventArgs>委托类型匹配的回调方法。

这是委托类型的定义,所以方法原型必须具有以下形式:

第三步,定义负责引发事件的方法来通知事件的登记对象

按照约定,类要定义一个受保护的虚方法。引发事件时,类及其派生类的代码会调用该方法。方法只获取一个参数,即一个NewMailEventArgs对象,其中包含了传给接收通知的对象的信息。方法的默认实现只是检查一下是否有对象登记了对事件的关注。如果有,就引发事件来通知事件的登记对象。

(以线程安全的方式引发事件,可以自行搜索)

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

类还必须有一个方法获取输入并转化为事件的引发。

这个方法接收关于邮件的信息并构造NewMailEventArgs对象,将邮件信息传给它的构造器。然后调用MailManager自己的虚方法OnNewMail来正式通知MailManager对象收到了新的邮件。这会导致事件的引发,从而通知所有已登记的方法。

//--设计监听事件的类型

C#要求代码使用+=和-=操作符在列表中增删委托。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值