让阳光指引生命的每一刻,乘着风,跟随我融化空气

美丽的地球,有美丽的cnblog [hjp3]hjptype=song&player=1&son=http://www.taihugolf.com.cn/villa/sound_00ok01.mp3&autoplay=yes&autoreplay=1&bgcolor=FFFFFF&width=200&height=20[/hjp3]

asp.NET自定义服务器控件内部细节系列教程一


如大家要转载,请保留本人的版权:
/*
*Description:asp.NET自定义服务器控件内部细节系列教程
*Auther:崇崇-天真的好蓝
*MSN:chongchong2008@msn.com
*Dates:2007-05-20
*Copyright:ChongChong2008 YiChang HuBei China
*/

关于自定义asp.NET自定义服务器控件文章和源码示例网上已经很多了,不过有些内部些节方面,让一些初次接触这方面技术的朋友难以理解,对服务器控件的方方面面也很疑惑。为此,我抽出些时间把自己所理解的东西整理出来,方便大家交流学习。

 

一 理解事件委托,事件,引发事件以及事件优化

   .NET框架的事件委托和事件数据的命名约定:
   事件数据类由事件名加后缀EventArgs构成,如:SXLoginEventArgs
   事件委托由事件名加后缀EventHandler构成,如:SXLoginEventHandler
   引发事件的方法名字是在事件前加上前缀On,OnSXLogin

   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(events==null)
   {
    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)};
 }

posted on 2007-05-21 09:20 天真的好蓝啊 阅读(2068) 评论(6)  编辑 收藏 所属分类: C#.NET

Feedback

#1楼  2007-05-21 14:37 journey [未注册用户]

貌似你不该这么讲,自定义服务器控件。。。。。   回复  引用    

#2楼  2007-05-21 15:32 非我      

支持一下!   回复  引用  查看    

#3楼  2007-05-21 22:12 wma [未注册用户]

支持一下! 回复   回复  引用    

#4楼  2007-05-22 23:40 热门单曲 [未注册用户]

支持下楼主   回复  引用    

#5楼  2007-05-23 19:53 王琳 [未注册用户]

我也正在学这块,支持一记   回复  引用    

#6楼  2008-03-25 11:39 rey [未注册用户]

顶一下   回复  引用    



标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-05-21 10:35 编辑过
 
另存  打印
 


My Links

Blog Stats

News

与我联系

常用链接

留言簿(1)

我管理的小组

我的标签

随笔分类

随笔档案

相册

搜索

最新评论

阅读排行榜

评论排行榜

集从人之所长,创造博客社区神话,实现梦想!