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下载

 

 

 

 

 

posted @ 2010-03-23 22:34  爱图--UpdooGIS  阅读(296)  评论(0编辑  收藏  举报