目录
委托
1,什么是委托
2,委托的定义
3,使用委托
4,委托的多播
事件
1,什么是事件
2,事件的定义
3,订阅和触发事件
4,事件的访问控制
5,事件的多播
委托
1,什么是委托
委托是一个函数指针,可以存储方法的引用,并且能够在运行时调用这些方法。委托允许将方法作为参数传递,或将方法作为返回值返回
2,委托的定义
例:
// 定义一个委托
public delegate void MyDelegate(string message);
这个委托MyDelegate表示可以接受一个string类型的参数且没有返回值的方法
3,使用委托
定义委托后,可以通过它来引用和调用方法
例:
// 一个普通的方法,符合委托签名
public void DisplayMessage(string message)
{Console.WriteLine(message);}public void Example()
{// 创建委托实例并绑定到方法MyDelegate myDelegate = new MyDelegate(DisplayMessage);// 调用委托,实际上是调用 DisplayMessage 方法myDelegate("Hello, Delegate!");}
输出
Hello,Delegate!
也可以使用匿名方法或lamba表达式来创建委托
例:
MyDelegate myDelegate = (message) => Console.WriteLine(message);
myDelegate("Hello from Lambda!");
4,委托的多播
委托是可以多播的,即一个委托实例可以同时调用多个方法,可以使用+操作符将多个方法添加到同一个委托实例中
例:
public void AnotherMethod(string message)
{Console.WriteLine("Another: " + message);}public void ExampleMulticast()
{MyDelegate myDelegate = DisplayMessage;myDelegate += AnotherMethod; // 添加方法myDelegate("Hello, Multicast!"); // 调用时会依次调用 DisplayMessage 和 AnotherMethod}
输出
Hello,Multicast!
Another:Hello,Multicast!
事件
1,什么是事件
事件是基于委托的一个特殊机制,用于实现发布/订阅模式,当某个条件发生时,事件会通知到所有订阅者。事件是对委托的一种封装,提供了更加安全和规范的方式来处理回调
2,事件的定义
事件是委托时高级封装,通常由类或结构体声明并用于通知外部对象发生了某些行为或状态变化
例:
public class MyEventPublisher
{// 定义一个委托public delegate void MyEventHandler(string message);// 声明一个事件public event MyEventHandler MyEvent;// 触发事件的方法public void TriggerEvent(string message){if (MyEvent != null){MyEvent(message); // 调用所有订阅者的方法}}}
3,订阅和触发事件
事件必须由外部代码订阅,当事件发生时,发布者会通知所有订阅者
例:
public class MyEventListener
{public void OnEventTriggered(string message){Console.WriteLine("Event Triggered: " + message);}}public void ExampleEvent()
{MyEventPublisher publisher = new MyEventPublisher();MyEventListener listener = new MyEventListener();// 订阅事件publisher.MyEvent += listener.OnEventTriggered;// 触发事件publisher.TriggerEvent("Hello, Event!");}
输出
Event Triggered: Hello, Event!
上面的listener的OnEventTriggered方法订阅了事件MyEvent,当MyEvent事件被触发时(也就是调用TriggerEvent方法时),所有被订阅的方法都会收到通知,执行对应操作
4,事件的访问控制
事件通常用Event关键字定义,并且其委托可以被限制为只能添加或删除事件处理程序,外部代码不能直接触发事件,只能通过+=和-=操作符来订阅和退订事件
例:
public event MyEventHandler MyEvent;
public void Example()
{
// 订阅事件
MyEvent += DisplayMessage;
// 触发事件的代码由事件的发布者控制
// 不允许外部代码直接调用 MyEvent();
}
5,事件的多播
类似委托,事件也可以多播,这意味着你可以将多个事件处理程序添加到一个事件上,当事件被触发时,所有订阅的处理程序都会依次调用
例:
public void AnotherHandler(string message)
{Console.WriteLine("Another Handler: " + message);}public void ExampleMulticastEvent()
{MyEventPublisher publisher = new MyEventPublisher();// 订阅多个处理程序publisher.MyEvent += DisplayMessage;publisher.MyEvent += AnotherHandler;// 触发事件时会依次调用两个处理程序publisher.TriggerEvent("Multicast Event Triggered!");}
输出
Event Triggered: Multicast Event Triggered!
Another: Multicast Event Triggered!