- 热门文章:
- · 第十章 属性[《.net框架程序设计》读书笔记]
- · 第九章 方法[《.net框架程序设计》读书笔记]
- · 第八章 常数与字段[《.NET框架程序设计》读书笔记]
- · 第七章 类型成员及其访问限定[《.NET框架程序设计》读书笔记]
- · 手工修改动网新闻.net3.0的Bug
- · .net的MSMQ异步调用
- · 关于《.net框架程序设计》读书笔记
- · 前言[《.net框架程序设计》读书笔记]
- · 发布一个通用面板程序(htc)
- · .Net 实现纳秒级别计算
- · 快速理解.NET Framework[翻译]
- · .NET框架程序设计读书笔记(三)--.net框架类库(FCL)和通用类型系统、代码互操作
上一篇:第十二章 委托[《.net框架程序设计》读书笔记] >>
第十一章 事件[《.net框架程序设计》读书笔记]
摘要:
?????? 本章讲述事件的应用,包括:
n???????? 发布事件设计模式
n???????? 侦听事件的方法
n???????? 显式控制事件注册
n???????? 一个类型定义多个事件并减少内存资源
?
一、???????????? 发布事件
1、发布事件的类型提供的功能:
l???????? 允许其他对象登记事件
l???????? 允许其他对象注销事件
l???????? 维护一个登记对象列表,在事件发生时通知相应的登记对象
2、发布事件步骤:
l???????? 定义事件附加信息类型
l???????? 定义事件触发时被调用的委托类型(Delegate回调函数)
l???????? 定义事件成员。形如:public event [EventName]EventHandler Msg;
l???????? 定义一个受保护的虚方法(protected virtual),负责通知事件的登记对象
l???????? 定义一个将输入转化为事件的方法
3、.NET框架的一些约定:
l???????? .NET框架建议附加信息类型名以EventArgs结尾([EventName]EventArgs);无需传递附加信息的事件使用EventArgs.Empty静态只读字段
l???????? .NET框架建议委托原形为:void [EventName]EventHandler(Object sender, [EventName]EventArgs e);无需附加信息的直接用System.EventHandler委托类型,并使用EventArgs.Emtpy静态只读字段作为第2个参数
4、对事件定义的剖析:
若发布事件的类型中有如下事件定义:
?
public event EventNameEventHandler EventMsg;
?
则被编译器翻译为:
?
private EventNameEventHandler EventMsg = null;
[MethodImplAttribute(MeghodImplOptions.Synchronized)]?????? //用于线程安全,需要开销
public void add_EventMsg(EventNameEventHandler handler)
{
?????? EventMsg = (EventNameEventHandler)Delegate.Combine(EventMsg, handler);
}
[MethodImplAttribute(MeghodImplOptions.Synchronized)]?????? //用于线程安全,需要开销
public void remove_EventMsg(EventNameEventHandler handler)
{
?????? EventMsg = (EventNameEventHandler)Delegate.Remove(EventMsg, handler);
}
?
联系显式定义事件的方法,有异曲同工之妙。
二、???????????? 侦听事件
侦听过程分为以下几个步骤:
l???????? 定义事件通知回调函数,在其中处理到达的事件
l???????? 登记本对象到发布事件的类型
l???????? 注销本对象
三、???????????? 显式控制事件注册
显示控制事件注册是为了在单线程应用中消除由于线程同步带来的开销(见上面对事件定义的剖析),因此仅当无需线程同步时,显示发布事件才有用。
参考发布事件中的描述,显式控制事件注册只是将“定义事件成员”分解为:
l???????? 定义委托类型
l???????? 显式定义事件及访问器方法。注意必须同时定义add和remove方法
l???????? 修改通知事件登记对象的方法,使用刚定义的委托类型
四、???????????? 定义多个事件
定义多个事件主要为了公开大量的事件但不为每个事件分配字段,使用哈希表或链表(如FCL中的System.ComponentModel.EventHandlerList)存储这些事件实例。这只有在有非常多的事件且预期大部分事件都不实现时才有用。
?
理解这部分内容要抓住以下几个方面:
l???????? 上面对事件定义的剖析,其中的方法也是在集合中添加事件委托的方法
l???????? 为每种事件建立一个唯一键(通过建立一个静态只读对象来标识)用以标识事件
l???????? 其余同单一事件的发布
五、???????????? 示例
请参阅另一篇文章“第十一章 多事件示例[一个男人和三个女人的故事]”
?
本章牵涉到的其他知识点:
ü???????? 委托的应用(第十七章详述)
ü???????? 线程安全的保障
ü???????? 散列表(Hashtable)的应用
在后续笔记中会有详述。
?
下一篇:第十章 属性[《.net框架程序设计》读书笔记] >>
相关文章:
- · NET框架程序设计读书笔记(三)--执行程序集代码
- · 动态加载树----treeView
- · 在Internet上用通过.Net Remoting机制实现服务器对客户端的直接调用
- · .NET中的强名称机制
- · .NET中的GAC
- · .net框架程序设计读书笔记二(Microsoft .net 框架开发平台体系架构)
- · .net 框架程序设计 读书笔记(一)---.net 平台构成
- · .NET中的版本号
- · Win32类型和.net类型的对应表
- · 实战 .Net 数据访问层 - 1
- · 基于.Net的AOP实现技术
- · 非常了不起的工具iNET----------帮你实现.NET项目跨平台运行.
- · 服务器端异步 Web 方法
- · Prototype设计模式的实现
- · 用WinDbg探索CLR世界 [3] 跟踪方法的 JIT 过程
- · .net+oracle+crystalReports开发web应用程序学习笔记(二)
- · 使用.net Remtoing进行并行计算
- · 我的O/R Mapping实际开发经验之谈(二)
- · 走近COM Interop——RCW入门
- · 基于Grove的.NET应用程序开发提示
- · datagrid的正反双向排序
- · DataGrid在分页状态下删除纪录的问题
- · 未找到路径“D:\”的一部分 的问题解决
- · 在下拉列表框中显示多列的两种简易实现方式
- · .NET 1.1中预编译ASP.NET页面实现原理浅析 [1] 自动预编译机制浅析
- · IEWebControl TreeView右键菜单实例
- · 正则表达式测试程序
- · 创建插件框架(2)
- · 创建插件框架(1)
- · 来自开源社区的声音: .NET vs JAVA
- · .net下分层架构系统的开发技术规范(2)
- · 在.NET 中模拟提交Post数据
- · 以武學的視角來戲說.NET程序員的倚天之術
- · XP方法学习总结及对小组开发的思考
- · 程序员的.NET时代(二)
- · 程序员的.NET时代(一)
- · 品味.NET巨著——书评《Microsoft .NET框架程序设计(修订版)》
- · 解决.NET(WebApplication)安装部署的不能选择安装路径的问题
