事件基于委托,用于对象间通信。首先定义EventHandler或自定义EventArgs传递数据,通过event关键字声明事件,使用OnEventName模式触发,订阅用+=,取消用-=,注意检查null并及时取消订阅以防内存泄漏。

在 C# 中,事件(Event)是一种用于实现观察者模式的机制,常用于对象间通信,比如 UI 控件响应用户操作、服务状态变更通知等。合理定义和触发事件能让代码更灵活、解耦更好。
事件的基本定义
事件基于委托(Delegate),因此定义事件前需要先定义一个委托类型,或使用系统提供的通用委托如 EventHandler 或 EventHandler<TEventArgs>。
以下是一个使用 EventHandler 定义事件的示例:
public class MyPublisher
{
// 定义事件
public event EventHandler MyEvent;
// 触发事件的方法
protected virtual void OnMyEvent()
{
MyEvent?.Invoke(this, EventArgs.Empty);
}
// 模拟条件满足时触发事件
public void DoSomething()
{
// 执行某些逻辑
Console.WriteLine("执行操作...");
// 触发事件
OnMyEvent();
}
}
自定义事件参数
如果需要传递额外数据,可以继承 EventArgs 创建自定义参数类。
public class MyEventArgs : EventArgs
{
public string Message { get; set; }
public MyEventArgs(string message)
{
Message = message;
}
}
然后在类中使用泛型事件:
public class MyPublisher
{
public event EventHandler<MyEventArgs> CustomEvent;
protected virtual void OnCustomEvent(string msg)
{
CustomEvent?.Invoke(this, new MyEventArgs(msg));
}
public void TriggerCustomEvent()
{
OnCustomEvent("这是自定义消息");
}
}
订阅与取消订阅事件
其他类可以通过 += 订阅事件,用 -= 取消订阅。
class Program
{
static void Main()
{
var publisher = new MyPublisher();
// 订阅事件
publisher.MyEvent += HandleMyEvent;
publisher.CustomEvent += HandleCustomEvent;
publisher.DoSomething();
publisher.TriggerCustomEvent();
// 取消订阅
publisher.MyEvent -= HandleMyEvent;
}
static void HandleMyEvent(object sender, EventArgs e)
{
Console.WriteLine("MyEvent 被触发");
}
static void HandleCustomEvent(object sender, MyEventArgs e)
{
Console.WriteLine($"收到消息: {e.Message}");
}
}
注意事项与最佳实践
- 始终在触发事件前检查是否为 null,或使用 null 条件运算符 ?. 避免异常
- 将触发方法命名为 OnXXX 是 .NET 的命名惯例
- 使用 virtual 方法以便派生类可重写事件触发行为
- 记得在适当时机取消订阅,防止内存泄漏,尤其是在长时间存在的发布者中
- 优先使用 EventHandler 或 EventHandler<T>,而非自定义委托,除非有特殊需求
基本上就这些。掌握事件的定义、触发和处理方式,能帮助你写出更清晰、响应性更强的 C# 程序。
以上就是C# 如何定义和触发事件_C# 事件定义与触发方法指南的详细内容,更多请关注php中文网其它相关文章!