网站开发的网页模板,漳州网站建设公司推荐,app用户量排名,关于新农村网络建设网站如大家要转载#xff0c;请保留本人的版权:/* *Description:asp.NET自定义服务器控件内部细节系列教程*Auther:崇崇-天真的好蓝 *MSN:chongchong2008msn.com *Dates:2007-05-20*Copyright:ChongChong2008 YiChang HuBei China */关于自定义asp.NET自定义服务器控件文章和源码示…如大家要转载请保留本人的版权:/* *Description:asp.NET自定义服务器控件内部细节系列教程*Auther:崇崇-天真的好蓝 *MSN:chongchong2008msn.com *Dates:2007-05-20*Copyright:ChongChong2008 YiChang HuBei China */关于自定义asp.NET自定义服务器控件文章和源码示例网上已经很多了不过有些内部些节方面让一些初次接触这方面技术的朋友难以理解对服务器控件的方方面面也很疑惑。为此我抽出些时间把自己所理解的东西整理出来方便大家交流学习。 一 理解事件委托事件引发事件以及事件优化 .NET框架的事件委托和事件数据的命名约定 事件数据类由事件名加后缀EventArgs构成如SXLoginEventArgs 事件委托由事件名加后缀EventHandler构成如SXLoginEventHandler 引发事件的方法名字是在事件前加上前缀OnOnSXLogin 1。事件委托 委托其实是一个类委托具有函数指针的粒度和接口的安全性为什么这样说是因为委托就是安全类型的函数指针用来回调方法方法的签名必须和委托的签名相匹配。 下面我们看看委托的声名: public delegate void SXLoginEventHandler(object sender,SXLoginEventArgs e); 上面的定义表示定义了一个SXLoginEventHandler的事件委托返回类型是void并分别接受一个object和SXLoginEventArgs类型的参数。object表示事件的发送者e表示描述事件的数据。 可以看出事件委托的声名和类的声名是类似的只需增加关键字delegate即可。 委托间接派生于System.Delegate直接派生于System.MulticastDelegate。 2。事件 事件是当有动作发生或状态改变时类发出的信息或通知。 下面我们看看事件的声名: public event SXLoginEventHandler SXLogin ; 可以看出事件是与一个委托相关联的。 3。引发事件 为了在类中实现事件需要一个事件数据类事件委托以及一个发布事件通知的方法。我们需要把这些组合在一起下面给一个例子 3.1 如果类没有任何关联的事件数据就直接使用EventArgs类或其它已存在的事件数据类必须匹配。否则需要定义一个事件数据类这个类必须从System.EventArgs中派生如下 public class SXLoginEventArgs:EventArgs{...} 3.2 如果事件没有关联的数据就直接使用System.EventHandler作为事件委托否则需要定一个事件委托如下 public delegate void SXLoginEventHandler(object sender , SXLoginEventArgs e ); 3.3 用event关键字定义事件成员后面紧跟与此对应的事件委托如下 public event SXLoginEventHandler SXLogin ; 3.4 在类中定义一个虚方法调用事件委托方法的名字是在事件前加上前缀On如下 protected virtual void OnSXLogin(SXLoginEventArgs e) { if(SXLogin ! null) { SXLogin(this , e); } } 4。事件优化 如果一个类中引发了多个事件通过为每一个事件声名一个事件字段成员来执行时低效的为此我们换一种方法用属性来定义事件。 .NET框架有一个System.ComponentModel.EventHanlderList类这个类是一个优化了的委托存储和取回的链表。下面来看看优化事件模式是如何实现的 private EventHanlderList events ; protected EventHanlderList Events { get { if(eventsnull) { events new EventHanlderList(); } return events; } } protected static readonly object SXLoginEventObject new object(); 我们用属性而不是字段来定义事件如下 public event SXLoginEventHandler SXLogin { add{Events.AddHandler(SXLoginEventObject,value)}; remove{Events.RemoveHandler(SXLoginEventObject,value)}; }