C#委託事件

C#委託事件
原文轉自:http://blog.csdn.net/kingmax54212008/article/details/2021565
一、委託
委託類似於函數指針,但函數指針只能引用靜態方法,而委託既能引用靜態方法,也能引用實例方法。

委託使用分三步:1、委託聲明。2、委託實例化。3、委託調用。
例程一:
 程序代碼

using System;

namespace 委託
{
     delegate int NumOpe(int a,int b); //第一步:委託聲明
     class Class1
     {
         static void Main(string[] args)
         {
             Class1 c1 = new Class1();
             NumOpe p1 = new NumOpe(c1.Add); //委託實例化,注意參數是要使用的參數名,且不帶括號
             Console.WriteLine(p1(1,2)); //委託調用
             Console.ReadLine();
         }

         private int Add(int num1,int num2)
         {
             return(num1+num2);
         }
     }
}

例中,委託NumOpe引用了方法Add。
委託聲明瞭以後,就可以象類一樣進行實例化,實例化時把要引用的方法(如:Add)做爲參數,這樣委託和方法就關聯了起來,就可以用委託來引用方法了。
委託和所引用的方法必須保持一致:
1、參數個數、類型、順序必須完全一致。
2、返回值必須一致。

二、事件

事件有很多,比如說鼠標的事件:MouserMove,MouserDown等,鍵盤的事件:KeyUp,KeyDown,KeyPress。

有事件,就會有對事件進行處理的方法,而事件和處理方法之間是怎麼聯繫起來的呢?委託就是他們中間的橋樑,事件發生時,委託會知道,然後將事件傳遞給處理方法,處理方法進行相應處理。

比如在WinForm中最常見的是按鈕的Click事件,它是這樣委託的:this.button1.Click += new System.EventHandler(this.button1_Click);按按鈕後就會出發button1_Click方法進行處理。EventHandler就是系統類庫裏已經聲明的一個委託。-------委託實例化,this.buttion1_click爲方法名

三、自定義事件及其處理

EventHandler以及其它自定義的事件委託都是一類特殊的委託,他們有相同的形式:

delegate void 事件委託名(object sender,EventArgs e);

object用來傳遞事件的發生者,比如二中的Button控件就是一個事件發生者;EventArgs用來傳遞事件的細節。

例程二:
 程序代碼

using System;

namespace 最簡單的自定義事件
{
     /// <summary>
     /// 事件發送類
     /// </summary>
     class Class1
     {
         public delegate void UserRequest(object sender,EventArgs e); //定義委託
         public event UserRequest OnUserRequest; //定義一個委託類型的事件

         public void run()
         {
             while(true)
             {
                 if(Console.ReadLine()=="a")
                 {//事件監聽
                     OnUserRequest(this,new EventArgs()); //產生事件
                 }
             }
         }
     }

     /// <summary>
     /// 事件接收類
     /// </summary>
     class Class2
     {
         static void Main(string[] args)
         {
             Class1 c1 = new Class1();
             c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest); //委託實例化後綁定到事件
             c1.run();
         }

         private static void c1_OnUserRequest(object sender, EventArgs e)
         {//事件處理方法
             Console.WriteLine("/t你觸發了事件!");
         }
     }
}

例程三:
 程序代碼

using System;

namespace 帶事件數據的事件
{
     /// <summary>
     /// 帶事件數據的事件類,從EventArgs繼承
     /// </summary>
     class OnUserRequestEventArgs:EventArgs
     {
         private string inputText;
         public string InputText
         {
             get
             {
                 return inputText;
             }
             set
             {
                 inputText = value;
             }
         }
     }

     /// <summary>
     /// 事件發送類
     /// </summary>
     class Class1
     {
         public delegate void UserRequest(object sender,OnUserRequestEventArgs e);------------->聲明委託
         public event UserRequest OnUserRequest;------->定義一個委託類型的事件

         public void run()
         {
             while(true)
             {
                 Console.WriteLine("請輸入內容:");
                 string a=Console.ReadLine();
                 //if(a=="a")
                 //{
                 OnUserRequestEventArgs e1 = new OnUserRequestEventArgs();
                 e1.InputText = a;
                 OnUserRequest(this,e1);
                 //}
             }
         }
     }

     /// <summary>
     /// 事件接收類
     /// </summary>
     class Class2
     {
         [STAThread]
         static void Main(string[] args)
         {
             Class1 c1 = new Class1();
             c1.OnUserRequest += new Class1.UserRequest(c1_OnUserRequest);
             c1.run();
         }

         private static void c1_OnUserRequest(object sender, OnUserRequestEventArgs e)
         {
             Console.WriteLine("/t你輸入的是:"+e.InputText);
         }
     }
}

例程三跟例程二唯一的差別在於自定義了一個類OnUserRequestEventArgs,從EventArgs繼承
發佈了42 篇原創文章 · 獲贊 19 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章