C#事件(Event)
·
在 C# 中,事件(Event) 是基于委托的封装机制,用于实现对象之间的通信。可以看作是用户的一系列操作,例如点击键盘的某个按键、单击/移动鼠标等,当事件发生时我们可以针对事件做出一系列的响应,例如退出程序、记录日志等等。C# 中线程之间的通信就是使用事件机制实现的。以下是一个完整的 C# 事件(Event)经典例程,演示了事件的声明、订阅、触发以及处理的完整流程。本例程使用了 .NET 中的标准 EventHandler 委托和 EventArgs 类来构建一个简单的事件系统。
using System;
// 自定义 EventArgs 子类,用于传递额外信息
public class CustomEventArgs : EventArgs
{
public string Message { get; set; }
public CustomEventArgs(string message)
{
Message = message;
}
}
// 发布器类:包含事件和触发逻辑
public class Publisher
{
// 定义事件(基于 EventHandler 委托)
public event EventHandler<CustomEventArgs> MyEvent;
// 触发事件的方法
protected virtual void OnMyEvent(CustomEventArgs e)
{
// 检查是否有订阅者
MyEvent?.Invoke(this, e);
}
// 模拟事件触发条件
public void DoSomething()
{
Console.WriteLine("Publisher: 正在执行操作...");
CustomEventArgs args = new CustomEventArgs("事件被触发!");
OnMyEvent(args); // 触发事件
}
}
// 订阅器类:提供事件处理方法
public class Subscriber
{
public string Name { get; set; }
// 构造函数中可以传入订阅器名称
public Subscriber(string name)
{
Name = name;
}
// 事件处理方法,必须符合 EventHandler 的签名
public void HandleEvent(object sender, CustomEventArgs e)
{
Console.WriteLine($"{Name}: 收到事件消息 - {e.Message}");
}
}
class Program
{
static void Main(string[] args)
{
// 创建发布器和订阅器实例
Publisher publisher = new Publisher();
Subscriber subscriber1 = new Subscriber("订阅器A");
Subscriber subscriber2 = new Subscriber("订阅器B");
// 注册事件处理程序(订阅事件)
publisher.MyEvent += subscriber1.HandleEvent;
publisher.MyEvent += subscriber2.HandleEvent;
// 执行操作以触发事件
publisher.DoSomething();
// 可选:取消订阅
publisher.MyEvent -= subscriber1.HandleEvent;
// 再次触发事件,验证订阅是否成功移除
Console.WriteLine("\n第二次调用:");
publisher.DoSomething();
}
}
输出结果:
Publisher: 正在执行操作...
订阅器A: 收到事件消息 - 事件被触发!
订阅器B: 收到事件消息 - 事件被触发!第二次调用:
Publisher: 正在执行操作...
订阅器B: 收到事件消息 - 事件被触发!
程序说明:
-
自定义 EventArgs:
CustomEventArgs继承自EventArgs,用于在事件中传递自定义数据。 -
发布器类
Publisher:-
使用
event关键字定义事件MyEvent,其类型为泛型EventHandler<CustomEventArgs>。 -
OnMyEvent方法用于安全地触发事件。 -
DoSomething()是模拟事件触发的方法。
-
-
订阅器类
Subscriber:-
提供了一个与事件匹配的处理方法
HandleEvent。
-
-
主程序逻辑:
-
实例化发布器和两个订阅器。
-
使用
+=运算符将订阅器的处理方法注册到事件上。 -
调用
DoSomething()来触发事件,并观察输出结果。 -
展示如何通过
-=运算符取消订阅。
-
更多推荐



所有评论(0)