在 C# 中,事件是一种使类或对象能够通知其他类或对象发生了某些情况的机制。它们是基于委托的发布-订阅模式的实现。事件处理器(也称为事件监听器)是响应事件发生而被调用的方法,其实想明白了都是方法的回调,这块很重要,现在的开发基本以这种模式居多了。
在 C# 中,事件是使用委托类型来声明的。委托定义了事件处理器的签名,即事件处理器需要匹配的参数类型和返回类型。
C#// 定义事件处理器委托
public delegate void EventHandler(object sender, EventArgs e);
C#public class Publisher
{
// 使用 EventHandler 委托声明事件
public event EventHandler MyEvent;
// 触发事件的方法
protected virtual void OnMyEvent()
{
// 如果有方法订阅了事件,则调用
MyEvent?.Invoke(this, EventArgs.Empty);
}
}
在这个例子中,Publisher
类声明了一个名为 MyEvent
的事件,并定义了 OnMyEvent
方法来触发该事件。
要响应事件,需要将事件处理器方法订阅到事件。这通常在事件发布者的实例上完成。
C#public class Subscriber
{
public void Subscribe(Publisher publisher)
{
// 订阅事件
publisher.MyEvent += OnMyEvent;
}
// 事件处理器方法
private void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("事件被触发,处理器响应。");
}
}
在这个例子中,Subscriber
类有一个 Subscribe
方法,它订阅了 Publisher
类的 MyEvent
事件,并提供了 OnMyEvent
作为事件处理器。
事件是由其拥有者在特定条件下触发的。这通常是在某个方法内部,该方法检查某些条件是否满足,如果满足,则调用委托来通知所有订阅者。
C#public class Publisher
{
public event EventHandler MyEvent;
public void DoSomething()
{
// 执行某些操作
Console.WriteLine("执行操作...");
// 操作完成后触发事件
OnMyEvent();
}
protected virtual void OnMyEvent()
{
MyEvent?.Invoke(this, EventArgs.Empty);
}
}
在这个例子中,Publisher
类有一个 DoSomething
方法,在该方法中执行了一些操作,并在操作完成后触发了 MyEvent
事件。
C#namespace AppEvent
{
// 定义发布者类
public class Publisher
{
// 声明事件 - 使用 EventHandler 委托
public event EventHandler MyEvent;
public void DoSomething()
{
// 执行某些操作
Console.WriteLine("执行操作...");
// 触发事件
OnMyEvent();
}
// 受保护的虚拟方法用于触发事件
protected virtual void OnMyEvent()
{
// 使用 null 条件运算符安全地触发事件
MyEvent?.Invoke(this, EventArgs.Empty);
}
}
// 定义订阅者类
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
// 订阅事件
publisher.MyEvent += OnMyEvent;
}
// 取消订阅事件的方法
public void Unsubscribe(Publisher publisher)
{
// 取消订阅事件
publisher.MyEvent -= OnMyEvent;
}
// 事件处理器方法
private void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("事件被触发,处理器响应。");
}
}
internal class Program
{
static void Main(string[] args)
{
// 创建发布者实例
Publisher publisher = new Publisher();
// 创建订阅者实例
Subscriber subscriber1 = new Subscriber();
Subscriber subscriber2 = new Subscriber();
// 订阅事件
subscriber1.Subscribe(publisher);
subscriber2.Subscribe(publisher);
// 触发事件
publisher.DoSomething();
// 取消一个订阅者的订阅
subscriber1.Unsubscribe(publisher);
// 再次触发事件
publisher.DoSomething();
Console.ReadLine();
}
}
}
.NET 提供了 EventHandler
和 EventHandler<TEventArgs>
委托类型,可以用来声明和处理标准事件。TEventArgs
是 EventArgs
类的子类,用于传递事件数据。
C#namespace AppEvent
{
public class Publisher
{
// 使用内置 EventHandler 委托声明事件
public event EventHandler<EventArgs> MyEvent;
public void DoSomething()
{
// 执行某些操作
Console.WriteLine("执行操作...");
// 触发事件
OnMyEvent();
}
protected virtual void OnMyEvent()
{
MyEvent?.Invoke(this, EventArgs.Empty);
}
}
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
publisher.MyEvent += OnMyEvent;
}
private void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("内置事件处理器响应。");
}
}
internal class Program
{
static void Main(string[] args)
{
// 创建发布者实例
Publisher publisher = new Publisher();
// 创建订阅者实例
Subscriber subscriber1 = new Subscriber();
Subscriber subscriber2 = new Subscriber();
// 订阅事件
subscriber1.Subscribe(publisher);
subscriber2.Subscribe(publisher);
// 触发事件
publisher.DoSomething();
// 再次触发事件
publisher.DoSomething();
Console.ReadLine();
}
}
}
在这个例子中,我们使用了 EventHandler<EventArgs>
来声明 MyEvent
事件。
有时,你可能希望传递更多的信息给事件处理器。这可以通过创建继承自 EventArgs
的自定义类来实现。
C#namespace AppEvent
{
// 自定义事件参数类
public class CustomEventArgs : EventArgs
{
public string Message { get; }
public CustomEventArgs(string message)
{
Message = message;
}
}
public class Publisher
{
// 使用自定义事件参数
public event EventHandler<CustomEventArgs> MyEvent;
public void DoSomething()
{
// 发布事件
OnMyEvent("Hello, World!");
}
protected virtual void OnMyEvent(string message)
{
MyEvent?.Invoke(this, new CustomEventArgs(message));
}
}
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
publisher.MyEvent += OnMyEvent;
}
private void OnMyEvent(object sender, CustomEventArgs e)
{
Console.WriteLine($"自定义事件处理器响应: {e.Message}");
}
}
internal class Program
{
static void Main(string[] args)
{
// 创建发布者实例
Publisher publisher = new Publisher();
// 创建订阅者实例
Subscriber subscriber1 = new Subscriber();
Subscriber subscriber2 = new Subscriber();
// 订阅事件
subscriber1.Subscribe(publisher);
subscriber2.Subscribe(publisher);
// 触发事件
publisher.DoSomething();
// 再次触发事件
publisher.DoSomething();
Console.ReadLine();
}
}
}
在这个例子中,我们创建了一个名为 CustomEventArgs
的自定义事件参数类,它包含了一个 Message
属性。然后我们在 MyEvent
事件中使用了这个自定义类。
事件和事件处理器是 C# 中用于实现组件之间通信的关键机制。通过定义和订阅事件,类可以在保持松耦合的同时通知其他类发生了某些重要的事情。自定义事件参数允许传递更丰富的信息给事件处理器。掌握这些概念对于构建响应用户交互或其他系统事件的应用程序至关重要。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!