快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

第十一章 事件[《.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)的应用

在后续笔记中会有详述。

?




返回类别: 教程
上一教程: 手工修改动网新闻.net3.0的Bug
下一教程: 使用 ASP+ 列表绑定控件(上)

您可以阅读与"第十一章 事件[《.net框架程序设计》读书笔记]"相关的教程:
· 第十章 属性[《.net框架程序设计》读书笔记]
· 第十二章 委托[《.net框架程序设计》读书笔记]
· 第十三章 枚举类型与位标记[《.net框架程序设计》读书笔记]
· 第十五章 接口[《.net框架程序设计》读书笔记]
· 第十四章 数组[《.net框架程序设计》读书笔记]
    微笑服务 优质保证 索取样品