天天看點

委托和事件(二)--委托詳解

聲明委托(Delegate)

   委托聲明決定了可由該委托引用的方法。委托可指向一個與其具有相同标簽的方法。 例如,假設有一個委托:

public delegate int MyDelegateEventHandler (string s);      

 delegate 是關鍵詞,【注:EventHandler是一個聲明委托的微軟C#的命名标準,我的習慣是标準就要第一時間說,也就這個命名習慣要第一時間養成】

 完了,這就是委托,就這麼簡單,看看和我們一般的方法有什麼差別呢?

差別知道了吧,在現實生活中,委托隻是個指令,做事情是别人,而在程式世界裡委托隻是存儲了各個方法的位址,而他自己也是什麼也不做的。

執行個體化委托(Delegate)

一旦聲明了委托類型,委托對象必須使用  new  關鍵字來建立,且與一個特定的方法有關。當建立委托時,傳遞到  new  語句的參數就像方法調用一樣書寫,但是不帶有參數。例如:

public delegate void printStringEventHandler(string s);
...
printStringEventHandler ps1 = new printStringEventHandler(WriteToScreen);
printStringEventHandler ps2 = new printStringEventHandler(WriteToFile);      

下面的執行個體示範了委托的聲明、執行個體化和使用,該委托可用于引用帶有一個整型參數的方法,并傳回一個整型值。

using System;

delegate int NumberChangerEventHandler(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         // 建立委托執行個體
         NumberChangerEventHandler nc1 = new NumberChangerEventHandler(AddNum);
         NumberChangerEventHandler nc2 = new NumberChangerEventHandler(MultNum);
         // 使用委托對象調用方法
         nc1(25);
         Console.WriteLine("Value of Num: {0}", getNum());
         nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}      
當上面的代碼被編譯和執行時,它會産生下列結果:
      
Value of Num: 35
Value of Num: 175      

注釋:因為num為靜态類型,是以

static int num = 10;  隻執行一次。經過nc1後num變為35.是以執行nc2(5),35*5=175      

委托的多點傳播(Multicasting of a Delegate)

委托對象可使用 "+" 運算符進行合并。一個合并委托調用它所合并的兩個委托。隻有相同類型的委托可被合并。"-" 運算符可用于從合并的委托中移除元件委托。 使用委托的這個有用的特點,您可以建立一個委托被調用時要調用的方法的調用清單。這被稱為委托的 多點傳播(multicasting),也叫多點傳播。下面的程式示範了委托的多點傳播:
using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         // 建立委托執行個體
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         // 調用多點傳播
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}      
當上面的代碼被編譯和執行時,它會産生下列結果:
Value of Num: 75