C#.Net 和 Mircosoft AJAX Library 定义事件

一、 C#.Net事件定义

      在C#.Net中定义事件的方式最要有两种:第一种是每个事件定义一个代理;第二种使用EventHandlerList来管理事件。

      1、在第一种方式中根据.Net FrameWork是否支持泛型,又有稍微的区别。这里console类型程序监听输入的字符,并将输入的首个字符大写打印出来为例。

          定义部分:

代码
     // 键EventArgs参数
     public   class  KeyEventArgs:EventArgs
    {
        
private   char  _keyValue;
        
public  KeyEventArgs( char  keyValue)
        {
            
this ._keyValue  =  keyValue;
        }
        
public   char  get_Key(){
            
return   this ._keyValue;
        }
    }
    
// 字符监听类
     public   class  keyCharMonitor{

        
// .net framework 1.0/1.1 的方法
          public   delegate   void  KeyEventHandler( object  sender, KeyEventArgs eKey);
        
public   event  KeyEventHandler KeyDown;

        
/// /.net framework 2.0的方法,可以使用泛型
         // public event EventHandler<KeyEventArgs> KeyDown;

        
// 对外释放的事件,即外部可以通过该方法激发事件
          public   void  OnKeyDown(KeyEventArgs eKey)
        {
            
if  (KeyDown  !=   null )
            {
                KeyDown(
this , eKey);
            }
        }
    }

 

      使用部分:

     

代码
     public   class  User
    {
        
public  User()
        {
            
// 监听对象
            keyCharMonitor keyMonitor  =   new  keyCharMonitor();
            
            
// .net framework 1.0/1.1 的方法,绑定事件触发时的处理函数
             keyMonitor.KeyDown  +=   new  keyCharMonitor.KeyEventHandler(keyReiever.Echo);

            
/// /.net framework 2.0的方法,可以使用泛型
            
/// /EventHandler <KeyEventArgs> 包含在系统中
             // keyMonitor.KeyDown += new EventHandler<KeyEventArgs>(keyReiever.Echo);

            
bool  isFinished  =   false ;
            
do
            {
                Console.WriteLine(
" Input a char " );
                
string  response  =  Console.ReadLine();
                
char  responseChar  =  (response  ==   "" ?   '   '  :  char .ToUpper(response[ 0 ]);
                
switch  (responseChar)
                {
                    
case   ' X ' :
                        isFinished 
=   true ;
                        
break ;
                    
default :
                          
//  得到按键信息的参数
                           KeyEventArgs keyEventArgs  =   new  KeyEventArgs(responseChar);
                           
// 事件的触发点。通过使用监听对象的对外释放方法,触发执行keyMonitor.KeyDown事件,
                           
// 而keyMonitor.KeyDown有绑定keyReiever.Echo具体的处理函数
                           keyMonitor.OnKeyDown(keyEventArgs);
                        
break ;
                }
            } 
while  ( ! isFinished);
        }
    }

    
// keyMonitor.KeyDown事件触发的处理类
     public   static   class  keyReiever
    {
        
// keyMonitor.KeyDown事件触发时,响应的处理方法。具体参数参考事件委托的定义
         public   static   void  Echo( object  sender, KeyEventArgs e)
        {
            Console.WriteLine(
" You input char :  "   +  e.get_Key().ToString());
        }
    }

 

     2、第二种使用EventHandlerList来管理事件。组件或者控件在初始化了之后,并不是每个组件都会去触发其定义的事件,而使用了第一种方式的每个事件组件对象都要开辟内存区维护它,这样造成内存消耗大,释放后亦消耗cup去清除使用的内存,所以我们引进了第二种方式:

        定义部分:


 
public   class  someClass{
  
static   readonly   object  workEventKey =   new   object ();
  
// 这里的EventHandlerList是静态声明的,也可以根据事件动态声明
   protected  EventHandlerList eventDelegates = new  EventHandlerList();
  
public   event  EventHandler < WorkEventArgs >  work  // 这个和第一中方法中申明方法十分相似
  {
     add
     {
        
// 模板:AddHandler(object key,Delegates value);
         this .eventDelegates.AddHandler(workEventKey,value);
     }
     remove
     {
        
// 模板:RemoveHandler(object key,Delegates value);
         this .eventDelegates.RemoveHandler(workEventKey,value);
     }
  }
  
// 触发这个事件的方法
   protected   void  OnWork(WorkEventArgs e)
  {
     EventHandler
< WorkEventArgs >  workEventDelegate =
       (EventHandler
< WorkEventArgs > ) this .eventDelegates[workEventKey];
     
if (workEventDelegate != null )
     {
        workEventDelegate(
this ,e);
     }
  }
}

 

  二、Mircosoft Ajax Library事件定义

       MS Ajax Library事件的定义类似于c#中的第二种方式。

       定义部分:

 

MS Ajax Lib还有事件的Demo类
    Type.registerNamespace( " Demo " );
    
    Demo.Firer 
=  function()
    {
      
this ._events  =   null ;
    }
    Demo.Firer.prototype 
=
    {
      
// 动态获得Sys.EventHandlerList
      _get_events: function() {
        
if  ( ! this ._events) {
            
this ._events  =   new  Sys.EventHandlerList();
        }
        
return   this ._events;
      },
      
// 往EventHandlerList添加/删除事件的Delegate
      add_fire: function(handler) {
        
this ._get_events().addHandler( " fire " , handler);
      },
      remove_fire: function(handler) {
        
this ._get_events().removeHandler( " fire " , handler);
      },
      
// 对外提供的事件释放处
      raiseFire: function(e) {
        
// 得到对应的事件Delegate
        var handler  =   this ._get_events().getHandler( " fire " );
        
if  (handler) {
            
// 执行Delegate代理事件
            handler( this , e);
        }
      },
      
      
// 使用了上述的对外释放的事件
      fireAfter: function(seconds) {
        setTimeout(
            Function.createDelegate(
this , function() {  this .raiseFire(Sys.EventArgs.Empty); }),
            seconds 
*   1000 );
      }
    }

    Demo.Firer.registerClass(
" Demo.Firer " );

 

 

 

      演示代码下载:

          1、 C#.Net事件 [ 方法一]     Demo1下载

          1、 C#.Net事件 [ 方法二]     Demo2下载

 

 

 

 

 

你可能感兴趣的:(library)