事件处理: 委托是C#事件模型的核心。一个事件本质上是一个委托类型的字段,用于存储一系列方法的引用,当特定事件发生时,这些方法会被调用。
我们通过下面这个例子来讲解C#中事件(Event)的基本用法,通过Publisher类发布事件,Subscriber类订阅并处理这个事件。下面我用更直白的语言解释这个过程:
Publisher 类 想象一下,Publisher(发布者)就像是一个广播站,它可以发出某种信号或者说“事件”。在这个例子中,它有一个名为EventHappened的事件,这个事件的类型是EventHandler。你可以认为EventHandler是一种特殊的委托类型,它连接了事件触发的地方和事件响应的地方。当事件触发时,所有订阅了这个事件的人都会得到通知。
- public class Publisher
- {
- // 声明一个事件,类型是 EventHandler,它是一个委托类型,用于接收发送者对象和事件参数
- public event EventHandler
EventHappened; -
- // 这个方法用于触发事件,即告诉所有订阅者:“事件发生了!”
- public void RaiseEvent()
- {
- // 使用?.运算符来安全地调用事件,如果没有人订阅,也不会抛出异常
- EventHappened?.Invoke(this, EventArgs.Empty);
- // this 表示事件发生的源头,EventArgs.Empty 是默认的事件参数,通常用于表示事件发生,但没有携带额外信息
- }
- }
Subscriber 类Subscriber(订阅者)就像是收音机,它对特定的广播(事件)感兴趣。在构造函数中,Subscriber订阅了来自Publisher的EventHappened事件,并指定了当这个事件发生时应该执行的方法OnEvent。
- public class Subscriber
- {
- // 构造函数中,订阅Publisher的EventHappened事件
- public Subscriber(Publisher pub)
- {
- // += 操作符用于订阅事件,OnEvent 是事件触发时执行的方法
- pub.EventHappened += OnEvent;
- }
-
- // 这是事件处理方法,当EventHappened事件被Publisher触发时,这个方法就会被执行
- private void OnEvent(object sender, EventArgs e)
- {
- // 打印一条消息,表明事件已被处理
- Console.WriteLine("Event handled.");
- }
- }
Publisher实例,它是事件的源头。Subscriber实例,并将它们与Publisher关联起来。这个关联过程就是订阅事件,通过在Subscriber的构造函数中向Publisher的事件添加事件处理程序(OnEvent方法)来实现。Publisher通过调用RaiseEvent方法“广播”事件时,所有订阅了这个事件的Subscriber实例都会接收到通知,并执行它们各自定义的OnEvent方法,完成事件的处理。简而言之,事件机制让对象能够通知其他对象“某件事发生了”,而不用直接调用那些对象的方法,增强了代码的解耦和灵活性。