在C#中,委托(delegate
)和事件(event
)经常一起使用,但它们之间确实有一些基本的区别:
-
委托(Delegate):委托是一个引用类型,它可以引用一个或多个具有特定签名的方法。简单地说,你可以将其视为一个类型安全的函数指针。
-
事件(Event):事件基于委托来实现,但它添加了一层封装,使得对象的其他部分不能直接调用或修改事件,除非是那些声明了这个事件的类。事件通常用于在类之间通信,一个类可以发布一个事件,而其他类可以订阅这个事件。
示例代码
委托:
cs
// 定义一个委托
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);
}
}
事件:
cs
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),但我们可以使用+=
订阅事件和使用-=
取消订阅事件。
这样,事件提供了更好的封装和控制,使外部代码不能直接调用或修改事件,除非是那些声明了这个事件的类。