[《.net框架程序设计》]第十一章 事件
来源:互联网 发布:日本人 知乎 编辑:程序博客网 时间:2024/04/30 01:35
第十一章 事件
摘要:
?????? 本章讲述事件的应用,包括:
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框架程序设计》第十一章 事件
- 《.NET框架程序设计》第十一章 事件
- 一个男人和三个女人的故事[《.net框架程序设计》_第十一章 多事件示例]
- 《.NET框架程序设计》第十一章 多事件示例:一个男人和三个女人的故事
- 《.NET框架程序设计》第十一章 多事件示例:一个男人和三个女人的故事
- Linux程序设计第十一章
- Objective-C 程序设计 第十一章
- 第4部分 事件-----《Microsoft.NET框架程序设计》
- 第4部分 事件2-----《Microsoft.NET框架程序设计》
- .NET组件程序设计 第6章 事件
- [《.net框架程序设计》]第九章 方法
- [《.net框架程序设计》]第十章 属性
- [《.net框架程序设计》]第十七章 委托
- [《.net框架程序设计》]第十四章 数组
- [《.net框架程序设计》]第十五章 接口
- 《.NET框架程序设计》第九章 方法
- 《.NET框架程序设计》第十章 属性
- 激活我的Blog
- 摩尔驾着瓦特的车
- jbuilder9.0和tomcat5.0和struts
- 进入新公司一个月的一些感想
- 答辩完了
- [《.net框架程序设计》]第十一章 事件
- 说几句
- DotNet开发中关于SQLServer连接的两种方法之比较
- 飞一样看完了refactoring后面的部分
- 把往事当行李,把岁月当垃圾
- Beyond三个人在途上(转)
- JDBC编程基础
- JAVA中最为关键的几个知识点
- 全世界所有程序员都会犯的错误