10.1.2 第二步:定义事件成员
事件成员使用C#关键字event定义。每个事件成员都有一个给定的可访问性(通常都为public,以便于其他代码也可以访问这个事件成员)、一个表示即将被调用方法的原型的委托类型以及一个名称(可以是任意有效的标识符)。NewMail类中事件成员的形式如下:
internal class MailManager {
//第二步:定义事件成员
public event EventHandler |
NewMail是事件的名称。事件成员的类型是EventHandler
public delegate void EventHandler |
因此方法原型必须具有下述形式:
void MethodName(Object sender, NewMailEventArgs e); |
注意 许多人可能会觉得奇怪,为什么事件模式要求sender参数的类型始终为Object。毕竟,因为MailManager是惟一一个引发拥有NewMailEventArgs对象的事件类型,所以回调方法的原型如下:
void MethodName(MailManager sender, NewMailEventArgs e); |
因为继承的缘故,该模式中要求sender参数的类型为Object。但是如果MailManager用作SmtpMailManager的基类,情况又会怎么样呢?在这种情况下,回调方法应使sender参数的原型为SmtpMailManager,而不是MailManager,但这种情况不会发生,因为SmtpMailManager只继承了NewMail事件。因此,希望使用SmtpMailManager引发事件的代码必须将sender参数的类型强制转换为SmtpMailManager。换句话说,类型间的强制转换仍然需要,因此,sender参数的类型也可能转换为Object。
其次,将sender参数的类型转换为Object仅仅是为了灵活。这样可以允许多个类型使用同一个委托,这个委托提供了一个传递NewMailEventArgs对象的事件。例如,尽管PopMailManager类不是从MailManager类派生的,但是PopMailManager类也可以使用这个委托。
此外,事件模式同样要求委托定义和回调方法将派生自EventArgs的参数命名为e。上述情况的惟一解释就是为了对模式增加一致性,使开发人员可以比较容易地学习和实现模式。生成源代码的工具(例如Microsoft的Visual Studio)同样知道调用参数e。
最后,事件模式要求所有的事件处理程序的返回类型都为void。必须这样做的原因是引发事件后可能要调用几个回调方法,因此不可能使每个回调方法都返回一个值。让返回类型为void就不会允许回调返回值。然而,在Microsoft.NET Framework类库中有一些事件处理程序,例如ResolveEventHandler,就没有遵守Microsoft自己规定的模式,因为ResolveEventHandler事件处理程序返回一个类型为Assembly的对象。
| 回书目 上一节 下一节 |
|
· C语言之基础自测获奖名.. · Linux服务器架设自测获.. · 边界网关安全防护自测.. · Cisco CCNA最新真题自.. · 我在美联储监管银行 书.. · 我在美联储监管银行 目.. |
· 我在美联储监管银行 前.. · 入侵的艺术 目录 · 入侵的艺术 前言 · 网管员全真面试题自测.. · 子弹的本质—— 形势没.. · 学习大量的词汇—— 对.. |
|
||||
| · 补丁自动分发管理策略.. · 杀毒王牌 · 微软出价446亿美元收购.. · AMD Phenom三核处理器.. · 国际文档格式标准开战 · 51CTO主编推荐经典专题 · Sun以10亿美元并购开源.. · 假期读书充电 |
· 2007盘点专题:有多少.. · 主流品牌防火墙配置 · Linux防火墙 · 了解统一威胁管理(UTM).. · 入侵防护系统(IPS)初探 · 如何优化IT 控制能耗 · 操作系统密码恢复专题 · Windows Server 2008 |
|||
|
||||
| · VPN技术 · SQL Server 2005全解 · SOA 面向服务架构 · 子网掩码教程 · SQL Server 2005全解 · 三层交换技术专题 · Windows远程桌面应用 · 深入了解PGP加密技术 |
· MySQL数据库备份 · 病毒查杀专题 · VPN技术 · Solaris 10 配置管理 · Linux 基础 · SSL VPN详细知识 · Linux防火墙 · 路由器设置与口令恢复 |
|||
|
||||
| · VPN技术 · SQL Server 2005全解 · SQL Server 2005全解 · SOA 面向服务架构 · 子网掩码教程 · 三层交换技术专题 · Windows远程桌面应用 · MySQL数据库备份 |
· 身份认证技术 · 病毒查杀专题 · 清除流氓软件——51CTO.. · SSL VPN详细知识 · Sniffer安全技术从入门.. · 常用交换机典型配置 · 路由器设置与口令恢复 · Linux 集群技术专题 |
|||