當前位置:開發者網絡 >> 技術教程 >> .NET教程 >> .NET Framework >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
初探.NET中的delegate類型與.NET事件
作者:未知
日期:2005-04-26
人氣:
投稿:(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:
 

1.瞭解delegate
delegate可以認為是一種函數的指針,一個delegate類型的實例代表可以代表一個方法,在實際使用中我們可以在不知道方法名稱的情況下調用到這個方法。前面說太多可能會使大家變得糊塗,或者摸不著頭腦,我舉個例子,來詳細說明此種類型的用法:


整個例程的代碼,是控制台項目.

//代碼開始
using System;

namespace ConsoleApp1
{
 
 public delegate string FunctionPointer(string strName);
 class Class1
 {
  
  [STAThread]
  static void Main(string[] args)
  {
   //
   // TODO: 在此處添加代碼以啟動應用程序
   System.Console.WriteLine("Hello World!");
   FunctionPointer fpa = new FunctionPointer(aFunction);
   FunctionPointer fpb = new FunctionPointer(bFunction);
   InvokeMethod(fpa);
   InvokeMethod(fpb);
   System.Console.ReadLine();
   //
  }
  public static string aFunction(string sNameA)
  {
   return "aFunction say i'm " + sNameA;
  }
  public static string bFunction(string sNameB)
  {
   return "bFunction say i'm " + sNameB;
  }
  public static void InvokeMethod(FunctionPointer fp)
  {
   System.Console.WriteLine(fp("storm"));
  }
 }
}
//代碼結束

步驟1:要使用delegate類型首先應該建立delegate樣板,所謂delegate樣板其實就是delegate能夠調用的方法的簽名,什麼是方法的簽名?方法的簽名可以認為是方法的參數類型、數量、返回值類型這些特徵。

定義的形勢如下: 訪問修飾符(public) delegate 返回值類型 名稱(參數列表);

說明:返回值類型應該是你定義的delegate類型所準備調用的方法的返回值類型,參數列表應該與你準備使用delegate來調用的方法的參數列表相同(指的是數量、類型、順序相同,名稱當然無所謂了)
一個實際的例子就是上面程序的
                public delegate string FunctionPointer(string strName);

步驟2:定義delegate準備調用的方法,當然該方法要與你剛才聲明的delegate有相同的返回值和參數表;
例如上面程序的:
                public static string aFunction(string sNameA)
                {
                     return "aFunction say I'm " + sNameA;
                }
                public static string bFunction(string sNameB)
               {
                     return "bFunction say I'm " + sNameB;
               }

步驟3:定義delegate類型的處理函數,在這裡可以定義如何調用你的delegate類型所指的方法,在實際使用中可以在這裡來動態決定傳入的參數等信息。
如上面程序的
                public static void InvokeMethod(FunctionPointer fp)
               {
                     System.Console.WriteLine(fp("storm97"));
               }

步驟4:建立delegate實例,傳入欲調用的方法名,要使用delegate類型必須建立他的實例,一個實例代表了一個方法的引用(可以這樣說)


delegate實例定義的形式:
           XXX(代表你定義的某個delegate類型的名稱)  實例名(假設是實例A) = new XXX([欲調用的方法名(假設是方法A)]);
意思是實例變量A指向方法A的程序代碼段;
如:

  static void Main(string[] args)
  {
   //
   // TODO: 在此處添加代碼以啟動應用程序
   System.Console.WriteLine("Hello World!");
   //建立第一個delegate的實例fpa,該實例代表方法aFunction;
   FunctionPointer fpa = new FunctionPointer(aFunction);
   //建立第一個delegate的實例fpa,該實例代表方法bFunction;
   FunctionPointer fpb = new FunctionPointer(bFunction);
   ......
   //
  }
下面就可以運行整個程序了。
如:
  static void Main(string[] args)
  {
   //
   ......
   //調用方法aFunction
   InvokeMethod(fpa);
   //調用方法bFunction
   InvokeMethod(fpb);
   //
  }

輸出結果: aFunction say I'm storm97
                      bFunction say I'm storm97

當然,從這個例子看不出delegate有什麼優勢,因為這個程序太簡單了,也許有人會說調用方法要這麼麻煩嗎,我直接調用就算了,何必要繞個大圈兒去調用呢,其實在實際應用中這種方式會給我們帶來很大的靈活性,以後在實際使用過程中你們會慢慢體會到的。:)


相關文章: