委托 (Delegate)
C++、Pascal 和其他一些支持函數指針概念的語言都允許我們在運行時選擇我們希望調用的函數。
Java 並沒有提供任何具有函數指針功能的結構,但是 C# 卻通過 System.Delegate 類提供了此功能。一個委托實例封裝一個方法,它是一個可調用實體。
對於實例方法,委托由包含類的實例以及該實例中的方法組成。對於靜態方法,可調用實體由一個類和此類中的靜態方法組成。因此,委托可用於調用任意對象的函數,並且委托是面向對象、類型安全且可靠的。
在定義和使用委托時有三個步驟:
• 聲明 • 實例化 • 調用我們可以用下面的語法聲明一個委托:
delegate void myDelegate();
然後,就可以用這個委托來引用返回 void 而且不帶任何參數的所有函數。
類似地,要為帶有 string 參數並返回 long 的任何函數創建一個委托,我們應該使用下面的語法:
delegate long myDelegate(string mystring);
然後,我們就可以將該委托指派給具有此簽名的任何方法,如下所示:
myDelegate Operation = new myDelegate(methodName);
重新指派委托
委托對象是不可改變的,也就是說,與它們匹配的簽名一旦設置就不能改變。然而,我們可以指向另一個方法,只要它們都具有相同的簽名即可。例如:
delegate myDelegate(int a, int b)
myDelegate Operation = new myDelegate(Add);
Operation = new myDelegate(Multiply);
這裡,我們將 operation 重新指派給一個新的委托對象,這樣 Operation 就可以調用 Multiply 方法。只有 Add() 和 Multiply() 都具有相同的簽名時,我們才可以這樣做。
調用委托
調用委托相當簡單,只需要將委托變量的名稱替換成方法的名稱即可:
delegate long myDelegate(int i, int j);
myDelegate Operation = new myDelegate(Add);
long lresult = Operation(10, 20);
這裡用值 10 和 20 調用 Add 方法,返回一個長整型結果,並將其賦給變量 lresult。
讓我們創建一個程序來快速地演示委托的創建、實例化和調用:
using System;
public class DelegateClass
{
delegate long myDelegate (int i, int j);
public static void Main(string[] args)
{
myDelegate Operation = new myDelegate(MathClass.Add);
Console.WriteLine("Call to Add method through delegate");
long l = Operation(10, 20);
Console.WriteLine("Sum of 10 and 20 is " + l);
Console.WriteLine("Call to Multiply method thru delegate");
Operation = new myDelegate(MathClass.Multiply);
l = Operation(1639, 1525);
Console.WriteLine("1639 multiplIEd by 1525 equals " + l);
}
}
public class MathClass
{
public static long Add (int i, int j)
{
return (i+j);
}
public static long Multiply (int i, int j)
{
return (i*j);
}
}
我們會得到這樣的輸出:
Call to Add method through delegate
Sum of 10 and 20 is 30
Call to Multiply method through delegate
1639 multiplIEd by 1525 equals 2499475