惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 聂微东
GbyAI
GbyAI
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 叶小钗
A
About on SuperTechFans
M
MIT News - Artificial intelligence
宝玉的分享
宝玉的分享
雷峰网
雷峰网
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
Google DeepMind News
Google DeepMind News
博客园 - Franky
B
Blog RSS Feed
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - ZmStudio.CN

非常用的着的HTML标签,为代码网页减肥! 重构oninit,应用在模式窗口的方法 权限设计[摘录] c#中out和ref的使用级区别 Loading... 到 链接颜色的渐变 C# 中数据类型转换 Windows\explorer.com 等特症的病毒 - ZmStudio.CN - 博客园 今天用vs2005实践了写自己的WEB控件,继承自panel AJAX基础教程 硬盘分区整数G计算公式[转] 收集的几个超经典的程序(不得不佩服老外的智商) 将asp.net1.1的应用程序升级到asp.net2.0的一点心得 Automation服务器不能创建对象问题 从...中检测到有潜在危险的 Request.Form 值的解决办法 (转载)Worm.QQ.TopFox病毒信息 怎样在数据绑定到DATAGRID之前,先判断其中一个字段是否为空? 第一次用联接查询语句,豁然开朗!! 深入剖析VB.NET变量的使用 简单应用程序命名规则
对ASP.NET中关于事件委托的理解
ZmStudio.CN · 2006-11-10 · via 博客园 - ZmStudio.CN


理解一:事件委托的概念
.NET框架的事件委托遵循特定的签名和命名约定。这种约定依赖于可视化设计工具,为客户端代码提供了一致性的模型。为了理解这种约定,下面来看看.NET框架中一个常见的可访问事件委托System.EventHandler:
public delegate void EventHandler(object sender,EventArgs e);

下面是一些特定的事件委托签名约定:

◎ 事件委托的返回类型是void

◎ 一个事件委托带有两个参数。第一个参数是object类型,表示事件的发送者。第二个参数描述事件的数据,是由System.EventArgs派生出的类的实例。

应该根据.NET框架的命名约定来给事件数据类和事件委托命名。事件数据类由事件名再添加后缀EventArgs构成,如MonthChangeEventArgs。

事件委托由事件名再添加EventHandler后缀构成,如MonthChangeEventHandler。事件委托用事件处理程序(Event Handler)命名是因为她们将绑定到处理事件的方法上。

理解二:Wiring事件

将事件处理程序和事件相关联的过程(添加委托给invocation列表)叫做事件布线(event wiring).
而从事件中删除事件处理程序的过程叫做事件撤线(event unwring)。
在C#中,对于一个事件的布线和撤线事件处理程序的语法如下:

button.Click += new EventHandler(this.Button_Clicked);
button.Click -= new EventHandler(this.Button_Clicked) ;

这里,button是Button控件的一个实例,并建立于具有Button_Clicked方法的类中,该方法处理按钮的Click事件。

理解三:事件委托的实现

为了在类中实现事件,需要一个事件数据的类、事件委托、在类中拥有invocation列表的委托成员,以及一个发布事件通知的方法。

具体实现过程如下:

1)如果类没有任何关联的事件数据,对事件数据使用EventArgs类。或者可以使用其他事先已经存在的事件数据类。如果不存在一个合适的事件数据类,则定义一个事件来包含事件数据。这个类必须从System.EventArgs中派生。按照规则它的名字应该是事件名加上EventArgs得到。例如,AdCreatedEventArgs,MonthChangedEventArgs.

下面的代码声明了一个事件数据类:
public class LowChargeEventArgs:EventArgs{...}

2) 如果事件没有关联数据,使用第一步的EventArgs,用System.EventHandler作为事件委托或者使用能匹配事件的预先存在的其他委托。如果不存在一个合适的事件委托,则定义一个事件委托,该委托的第二个参数具备来自第一步的事件数据类的类型。根据规则,事件委托的名字是在事件后附加EventHandler.例如,AdCreateEventHandler,MonthChangedEventHandler。下面的代码用来定义事件委托:
public delegate void LowChargeEventHandler(object sender,LowChargeEventArgs e);

3) 在类里,用event关键字定义事件成员。将事件名传递给事件成员。成员的类型是第二步中事件委托的类型。
如下面的例子:
public event LowChargeEventHandler LowCharge;

事件成员包含订阅事件的委托的列表。当调用这个成员时,它通过调用委托来分配事件。

4) 在类里,定义一个受保护的虚拟方法,在检查是否有事件监听器存在之后调用事件委托。其参数就是第一步中定义的事件数据×EventArgs。方法的名字是在事件名前加上前缀On。例如:
protected virtual void OnLowCharge(LowChargeEventArgs e){
    if (LowCharge != null){
      LowCharge(this,e);
      }
}

On<EventName>方法的目的是用来通知事件订阅者。