前言
委托和事件的知识点比较难以理解,下面给刚入门的同学们带来一个案例,帮助大家更好的理解。
一、案例展示
这里我就用Winform演示这个案例。
首先主窗体只有两个按钮,分别用来触发事件和取消订阅事件,后面展示功能代码。
EventPublisher:事件发布者类
EventSubscriber:事件订阅者类
二、源码
首先定义一个委托,委托是一种类型,它可以存储对一个或多个方法的引用。
在这个案例中,我们定义了一个委托类型 MyEventHandler 它接受一个字符串参数,用于表示事件消息。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 定义一个委托
/// </summary>
/// <param name="msg"></param>
public delegate void MyEventHandler(string msg);
}
接下来创建一个事件发布者类 EventPublisher,这个类负责触发事件并通知所有订阅者。
在这个类中,我们定义了一个事件 MyEvent,它的类型是 MyEventHandler 委托(就是上面我们创建的委托)。
其他类可以订阅这个事件,并在事件触发时执行相应的处理方法。
在 RaiseEvent 方法中,我们首先检查事件是否有订阅者,
如果有,就依次调用订阅者注册的处理方法,将事件消息传递给它们。
/// <summary>
/// 定义事件发布者类
/// </summary>
public class EventPublisher
{
//定义事件
public event MyEventHandler MyEvent;
//触发事件的方法
public void RaiseEvent(string message)
{
//检查事件是否有订阅者
if (MyEvent != null)
{
//触发事件
MyEvent(message);
}
}
}
接下来创建一个事件订阅者类 EventSubscriber,它负责订阅事件并在事件触发时执行相应的处理逻辑。
在 Subscribe 方法中,我们将事件处理方法与事件关联起来,以便在事件触发时被调用。
/// <summary>
/// 定义事件订阅者类
/// </summary>
public class EventSubscriber
{
//订阅事件的方法
public void Subscribe(EventPublisher publisher)
{
//将事件处理方法与事件关联起来
publisher.MyEvent += HandleEvent;
}
//取消订阅事件的方法
public void Unsubscribe(EventPublisher publisher)
{
//取消事件处理方法与事件的关联
publisher.MyEvent -= HandleEvent;
}
//事件处理方法
public void HandleEvent(string message)
{
MessageBox.Show($"收到事件消息:{message}");
}
}
接下来是Form1的完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mainform
{
public partial class Form1 : Form
{
private EventPublisher publisher;
private EventSubscriber subscriber;
/// <summary>
/// 定义一个委托
/// </summary>
/// <param name="msg"></param>
public delegate void MyEventHandler(string msg);
public Form1()
{
InitializeComponent();
//创建事件发布者对象
publisher = new EventPublisher();
//创建事件订阅者对象
subscriber = new EventSubscriber();
//订阅事件
subscriber.Subscribe(publisher);
}
private void btnRaiseEvent_Click(object sender, EventArgs e)
{
//触发事件
publisher.RaiseEvent("好好学习,天天向上!");
}
private void btnUnsubscribe_Click(object sender, EventArgs e)
{
//取消订阅事件
subscriber.Unsubscribe(publisher);
MessageBox.Show("取消订阅成功");
}
}
}
当点击触发事件按钮时,会调用事件发布者的 RaiseEvent 方法来触发事件
当点击取消订阅按钮时,则会调用事件订阅者的 Unsubscribe 方法来取消订阅事件。
Time
委托和事件的知识点比较抽象,同学们一定要反复揣摩,多写多练。