定義
委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性。
如果我們要把一個方法當作另一個方法的參數來傳遞,那么我們就需要用到委托。
可將任何可訪問類或結構中與委托類型匹配的任何方法分配給委托。 該方法可以是靜態方法,也可以是實例方法。 這樣便能通過編程方式來更改方法調用,還可以向現有類中插入新代碼。
- 語法:
寫在命名空間中或類中。
//定義一個委托,可賦值 返回值為空并且參數列表也為空的方法。
public delegate void PerformFunction1();
//定義一個委托, 可賦值 返回值為int,不需要參數的方法。
public delegate int PerformFunction2();
//定義一個委托, 可賦值 返回值為空,參數列表第一個為int,第二個為string,第三個為float的方法
public delegate void PerformFunction3(int age, string name, float height);
//定義一個委托, 可指向 返回值為bool, 參數列表為 任意兩個同類型的形參
public delegate bool Compare<in T>(T obj1, T obj2);
static void Main(string[] args)
{
// 兩種初始化方法
PerformFunction1 perform1 = new PerformFunction1(testFunction);
PerformFunction3 perform2 = printPersonDesc;
// 兩種調用方法
perform1();
perform2.Invoke(18, "張三", 1.87f);
}
static void printPersonDesc(int age, string name, float height)
{
Console.WriteLine(age + name + height);
}
static void testFunction()
{
Console.WriteLine("調用了testFunction");
}
將方法作為參數進行引用的能力使委托成為定義回調方法的理想選擇。 例如,對比較兩個對象的方法的引用可以作為參數傳遞到排序算法中。
示例
// 聲明委托——定義所需的簽名:
delegate double MathAction(double num);
class DelegateTest
{
//常規方法相匹配的簽名:
static double Double(double input)
{
return input * 2;
}
static void Main()
{
//實例化委托與命名方法:
MathAction ma = Double;
//調用委托ma:
double multByTwo = ma(4.5);
Console.WriteLine("multByTwo: {0}", multByTwo);
// 實例化委托與匿名方法:
MathAction ma2 = delegate(double input)
{
return input * input;
};
double square = ma2(5);
Console.WriteLine("square: {0}", square);
// 實例化委托與lambda表達式
MathAction ma3 = s => s * s * s;
double cube = ma3(4.375);
Console.WriteLine("cube: {0}", cube);
}
// Output:
// multByTwo: 9
// square: 25
// cube: 83.740234375
}