當前位置: 妍妍網 > 碼農

C#中的委托與事件

2024-05-15碼農

在C#編程中,委托(Delegate)和事件(Event)是兩個非常重要的概念,它們允許我們實作事件驅動編程,是觀察者設計模式的一種實作。委托用於定義方法的簽名,並允許將方法作為參數傳遞或賦值給變量,而事件則用於提供類或物件狀態變化的通知。

一、委托

委托是一種型別,它安全地封裝了方法的簽名和定義,可以被當做參數來傳遞。委托的聲明決定了可以參照哪種方法,即參數型別和返回值型別。

下面是一個簡單的委托範例:

using System;
// 定義一個委托型別,它接受兩個int參數,並返回int值
publicdelegateintBinaryOp(int x, int y);
classProgram
{
// 一個匹配BinaryOp委托的方法
staticintAdd(int a, int b)
{
return a + b;
}
staticvoidMain()
{
// 建立BinaryOp委托例項,並關聯Add方法
BinaryOp binaryOp = new BinaryOp(Add);
// 使用委托呼叫關聯的方法
int result = binaryOp(105);
Console.WriteLine(result); // 輸出15
}
}


在這個例子中,我們定義了一個名為 BinaryOp 的委托,它可以接受兩個 int 參數並返回一個 int 值。然後我們建立了一個 Add 方法,其簽名與 BinaryOp 委托相匹配。在 Main 方法中,我們建立了一個 BinaryOp 的例項,並將其與 Add 方法相關聯。最後,我們透過委托呼叫了 Add 方法,並輸出了結果。

二、事件

事件是基於委托實作的,為委托例項提供了一層封裝,增加了安全性和封裝性。事件使用 event 關鍵字進行聲明,並且只能在定義事件的類內部進行觸發,而不能由外部類觸發。這樣做的好處是防止了外部類濫用事件,增加了程式碼的安全性。

下面是一個使用事件的基礎範例:

using System;
// 定義一個委托型別
publicdelegatevoidMyEventHandler(object source, EventArgs args);
classMy class
{
// 定義一個事件基於上面的委托型別
publicevent MyEventHandler SomethingHappened;
publicvoidDoSomething()
{
// 執行某些操作...
Console.WriteLine("Doing something...");
// 觸發事件
OnSomethingHappened();
}
// 受保護的方法,用於觸發事件
protectedvirtualvoidOnSomethingHappened()
{
// 如果有訂閱者,則觸發事件
SomethingHappened?.Invoke(this, EventArgs.Empty);
}
}
classProgram
{
staticvoidMain()
{
My class my class = new My class();
// 訂閱事件
my class.SomethingHappened += My class_SomethingHappened;
my class.DoSomething(); // 執行操作並觸發事件
}
// 事件處理常式方法
privatestaticvoidMy class_SomethingHappened(object sender, EventArgs e)
{
Console.WriteLine("Something happened in My class!");
}
}





在這個例子中,我們定義了一個名為 MyEventHandler 的委托和一個名為 My class 的類。在 My class 中,我們聲明了一個名為 SomethingHappened 的事件,並在 DoSomething 方法中觸發了該事件。在 Main 方法中,我們建立了 My class 的一個例項,並訂閱了 SomethingHappened 事件。當 DoSomething 方法被呼叫時,它會觸發事件,並呼叫所有訂閱了該事件的事件處理常式。

三、總結

委托和事件是C#中實作事件驅動編程的重要機制。委托允許我們定義可以參照方法的型別,並可以將方法作為參數傳遞或賦值給變量。事件為委托例項提供了一層封裝,增加了程式碼的安全性和封裝性。透過委托和事件,我們可以實作松耦合的程式碼設計,使得不同的元件可以相互通訊而無需緊密地繫結在一起。