初探.NET中的delegate類型與.NET事件
2019-11-18 12:00:46
供稿:網友
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