1、事件
在C#中事件是一种特殊的委托类型,用于在对象之间提供一种基于观察者模式的通知机制。
1.1、事件的发送方定义了一个委托,委托类型的声明包含了事件的签名,即事件处理器方法的签名。
1.2、事件的订阅者可以通过+=运算符来注册事件处理器。
1.3、当事件发送方触发事件时,所有注册的事件处理器会被依次调用。
2、委托事件的实现
2.1、事件发布类
csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventApp
{
/// <summary>
/// 事件发布类
/// </summary>
internal class EventPublish
{
//定义委托类型,它具有事件处理器的签名
public delegate void EventHandler(object sender, EventArgs e);
//声明事件
public event EventHandler OneEvent;
//触发事件的方法
protected virtual void OnOneEvent(EventArgs e)
{
EventHandler handler = OneEvent;
handler?.Invoke(this, e);
}
//示例方法,可以在需要的时候触发事件
public void TriggerEvent()
{
OnOneEvent(EventArgs.Empty);
}
}
}
2.1、事件订阅类
csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventApp
{
/// <summary>
/// 事件订阅类
/// </summary>
internal class EventSubscribe
{
//订阅事件
public void Subscribe(EventPublish eventPublish)
{
eventPublish.OneEvent += EventPublish_OneEvent;
}
//事件处理函数
private void EventPublish_OneEvent(object sender, EventArgs e)
{
Console.WriteLine("Event is triggered!");
}
}
}
2.3、委托事件的实现
csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace EventApp
{
internal class Program
{
static void Main(string[] args)
{
EventPublish eventPublish = new EventPublish();
EventSubscribe eventSubscribe = new EventSubscribe();
//订阅事件
eventSubscribe.Subscribe(eventPublish);
Console.Write("Press <Enter> to trigger event\n");
while (Console.ReadKey().Key != ConsoleKey.Enter) { Thread.Sleep(100); }
//触发事件
eventPublish.TriggerEvent();
Console.ReadKey();
}
}
}
3、代码说明
在这个例子中,EventPublish 类定义了一个委托 EventHandler 和一个基于该委托类型的事件 OneEvent。OnOneEvent 方法是触发事件的方法,它检查事件是否有注册的处理器,并按顺序调用它们。TriggerEvent 方法用于触发事件。EventSubscribe 类中的 Subscribe 方法用于订阅事件,并提供了事件处理器 EventHandler。在 Main 方法中,我们创建了 EventPublish 和 EventSubscribe 的实例,并通过 Subscribe 方法将 EventHandler 注册到 OneEvent 上。最后通过 TriggerEvent 方法触发了事件,控制台上输出了 "Event is triggered!"。
4、运行效果