首页 > 编程 > .NET > 正文

asp.NET自定义服务器控件内部细节

2024-07-10 13:12:27
字体:
来源:转载
供稿:网友

如大家要转载,请保留本人的版权:
/*
*description:asp.net自定义服务器控件内部细节系列教程
*auther:崇崇-天真的好蓝
*msn:[email protected]
*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)};
 }

  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表