c# 委託 和 事件

 
一個函數帶有參數非常平常,但一個類帶有一個方法的參數可能會覺得奇怪,這就是委託的特徵。很多書籍都說委託就象C或C++的函數指針,說得不無道理,因爲它允許在委託對象的內部封裝方法的引用,也就是前面所說的帶有一個方法的參數,這個方法參數有一定的規則,它可以是靜態的,也可以是一個實例方法,這個方法的參數和返回類型必須和委託對象所帶的相同。 
         委託就像一箇中間代理,通過引用這個委託對象,就可以調用被這個委託對象所引用的方法,也就是它所帶的方法參數。可以調用它引用的方法,而不用管這個方法的哪個類的,因爲已經通過這個委託對象去引用這個類的方法了,即我們調用這個方法是通過這個委託中間代理來實現的。有一點好處就是委託它是面向對象的,而且類型安全的。看以下代碼:
class 委託人
{
 public string invokedmethod()  //注意此方法返回string,與委託對象相同,所要委託的事
 {
  Console.WriteLine("Hello"); 
 }
}

class  類
{
委託人 classobj = new 委託人();
delegate string 被委託人();  //聲明一個返回類型爲string的委託對象
被委託人 deleobj=new 被委託人(classobj.invokedmethod);//創建一個帶有方法的委託對象
deleobj();  //調用classobj.invokedmethod方法
}

        委託通常與事件一起結合使用。事件是對用戶動作的處理,當用戶有某種動作的時候,通過委託對象來執行,因此,事件是通過委託來聲明的。事件可以使用任何類型的委託,但有一點要注意,就是在使用組件時要遵循一些規則:事件使用的委託類型應有兩個參數,一個是對象源,一個是e參數。對象源表示事件發生的源 ; e表示封裝該事件的一些信息,這個e是從EventArgs類派生出來的。事件處理程序其實就同系統已定義的按鈕點擊事件,只不過這一次是由我們自己來定義而已。關於委託與事件的例子,參照http://blog.csdn.net/jabby12/archive/2004/08/02/58901.aspx

//********************************************/
/**//*       Delegate Sample
/* 
//*****************************************************************
*/


using System;

namespace EventTest
{
 
//事件類
 public class EventClass
 
{
  
public void display(object sender,System.EventArgs e)
  
{
   Console.WriteLine(
"This is the Event Class");
   Console.ReadLine();
  }

 }

 
//調用類
 class InvokeClass
 
{
  
//聲明代理對象,注意參數
   public delegate void delegateobj(object sender,System.EventArgs e);
  
//聲明事件對象 
  private event delegateobj obj;
  
//聲明要調用的事件類對象
  private EventClass ec;
  
  
public InvokeClass()
  
{
   ec
=new EventClass();
   
//添加事件對象到事件隊列中,參數爲要調用的事件
   this.obj+=new delegateobj(ec.display);
  }

  
//調用delegate對象觸發事件
  protected void OnObj(System.EventArgs e)
  
{
   
if(this.obj!=null)
   
{
     obj(
this,e);
   }

  }

  
public void RaiseEvent()
  
{
   EventArgs e
=new EventArgs();
   OnObj(e);
  }

  
static void Main(string[] args)
  
{
   InvokeClass ic
=new InvokeClass();
   Console.WriteLine(
"Please input a string");
   
string input=Console.ReadLine();
   
if(input.Equals(""))
   
{
    Console.WriteLine(
"Sorry,you don't input anything");
   }

   
else
   
{
    
//觸發事件
    ic.RaiseEvent();
   }

  }

 }

}

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章