事件处理: 委托是C#事件模型的核心。一个事件本质上是一个委托类型的字段,用于存储一系列方法的引用,当特定事件发生时,这些方法会被调用。
我们通过下面这个例子来讲解C#中事件(Event)的基本用法,通过Publisher
类发布事件,Subscriber
类订阅并处理这个事件。下面我用更直白的语言解释这个过程:
Publisher
类
想象一下,Publisher
(发布者)就像是一个广播站,它可以发出某种信号或者说“事件”。在这个例子中,它有一个名为EventHappened
的事件,这个事件的类型是EventHandler<EventArgs>
。你可以认为EventHandler<EventArgs>
是一种特殊的委托类型,它连接了事件触发的地方和事件响应的地方。当事件触发时,所有订阅了这个事件的人都会得到通知。
public class Publisher
{
// 声明一个事件,类型是 EventHandler,它是一个委托类型,用于接收发送者对象和事件参数
public event EventHandler<EventArgs> 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
方法,完成事件的处理。
简而言之,事件机制让对象能够通知其他对象“某件事发生了”,而不用直接调用那些对象的方法,增强了代码的解耦和灵活性。