在C#中,委托(delegate
)和事件(event
)經常一起使用,但它們之間確實有一些基本的區別:
-
委托(Delegate):委托是一個引用類型,它可以引用一個或多個具有特定簽名的方法。簡單地說,你可以將其視為一個類型安全的函數指針。
-
事件(Event):事件基于委托來實現,但它添加了一層封裝,使得對象的其他部分不能直接調用或修改事件,除非是那些聲明了這個事件的類。事件通常用于在類之間通信,一個類可以發布一個事件,而其他類可以訂閱這個事件。
示例代碼
委托:
// 定義一個委托
public delegate void MyDelegate(string message);public class MyClass
{// 使用委托public MyDelegate MyAction;public void TriggerAction(){MyAction?.Invoke("Triggered action!");}
}public class Program
{public static void Main(){MyClass obj = new MyClass();obj.MyAction += DisplayMessage;obj.TriggerAction();}static void DisplayMessage(string message){Console.WriteLine(message);}
}
事件:
public delegate void MyEventHandler(string message);public class EventPublisher
{// 使用事件public event MyEventHandler MyEvent;public void RaiseEvent(){MyEvent?.Invoke("Event raised!");}
}public class Program
{public static void Main(){EventPublisher publisher = new EventPublisher();publisher.MyEvent += OnMyEventOccurred; // 訂閱事件publisher.RaiseEvent();}static void OnMyEventOccurred(string message){Console.WriteLine(message);}
}
注意:
- 在委托的例子中,我們可以直接訪問和修改
MyAction
委托。 - 在事件的例子中,我們不能直接訪問或修改
MyEvent
事件(例如,不能直接調用或設置為null),但我們可以使用+=
訂閱事件和使用-=
取消訂閱事件。
這樣,事件提供了更好的封裝和控制,使外部代碼不能直接調用或修改事件,除非是那些聲明了這個事件的類。