如前所述,委托實例必須包含對象引用。在上面的示例中,通過將方法聲明為靜態的(意味著我們自己不需要指定對象引用),我們避免了這樣做。然而,如果委托引用一個實例方法,就必須給出對象引用,如下所示:
MathClass obj = new MathClass();
myDelegate Operation = new myDelegate(obj.Power);
其中,Power 是 MathClass 方法的一個實例。因此,如果 MathClass 的方法沒有聲明為靜態的,我們就可以通過委托來調用它們,如下所示:
using System;
public class DelegateClass
{
delegate long myDelegate(int i, int j);
public static void Main(string[] args)
{
MathClass mathObj = new MathClass();
myDelegate Operation = new myDelegate(mathObj.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(mathObj.Multiply);
l = Operation(1639, 1525);
Console.WriteLine("1639 multiplIEd by 1525 equals " + l);
}
}
當這些方法聲明為 static 時,如果您運行此程序,您就會得到同前面一樣的輸出。
委托和事件
.Net 框架也將委托廣泛應用於事件處理任務(像 Windows 或 Web 應用程序中的按鈕單擊事件)。雖然在 Java 中事件處理通常通過實現自定義偵聽器類來完成,但是 C# 開發人員可以利用委托來進行事件處理。事件被聲明為帶有委托類型的字段,只是在事件聲明前面加上 event 關鍵字。通常,事件被聲明為公共的,但是任何可訪問性修飾符都是允許的。下面的代碼顯示了委托和事件的聲明。
public delegate void CustomEventHandler(object sender, EventArgs e);
public event CustomEventHandler CustomEvent;
事件委托是多路廣播的,這意味著它們可以具有對多個事件處理方法的引用。通過維護事件的注冊事件處理程序列表,委托可以擔當引發事件的類的事件發送程序。下面的示例向您展示了可以如何給多個函數預訂事件。類 EventClass 包含委托、事件和調用事件的方法。注意,只能從聲明事件的類中調用事件。然後,類 TestClass 就可以使用 +=/-= 運算符來預訂/取消預訂事件。當調用 InvokeEvent() 方法時,它會激發此事件,而已經預訂此事件的任何函數都會同步激發,如下面的代碼所示:
using System;
class TestClass
{
static void Main(string[] args)
{
EventClass myEventClass = new EventClass();
// Associate the handler with the events
myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent1);
myEventClass.CustomEvent += new EventClass.CustomEventHandler(CustomEvent2);
myEventClass.InvokeEvent();
myEventClass.CustomEvent -= new EventClass.CustomEventHandler(CustomEvent2);
myEventClass.InvokeEvent();
}
private static void CustomEvent1(object sender, EventArgs e)
{
Console.WriteLine("Fire Event 1");
}
private static void CustomEvent2(object sender, EventArgs e)
{
Console.WriteLine("Fire Event 2");
}
}
public class EventClass
{
public delegate void CustomEventHandler(object sender, EventArgs e);
//Declare the event using the delegate datatype
public event CustomEventHandler CustomEvent;
public void InvokeEvent()
{
CustomEvent(this, EventArgs.Empty);
}
}
此程序的輸出如下:
Fire Event 1
Fire Event 2
Fire Event 1