事件的概念
- 在 C# 中,事件是一种特殊的委托,它为对象间的交互提供了一种发布 – 订阅机制。一个对象(发布者)可以发布事件,其他对象(订阅者)可以注册该事件并在事件触发时执行相应的操作。这有助于实现代码的松散耦合,使得不同模块之间可以通过事件进行通信,而不需要紧密依赖。
事件的定义与声明
- 定义委托类型:首先需要定义一个委托类型,该委托类型定义了事件处理方法的签名,即参数列表和返回类型。
public delegate void MyEventHandler(object sender, EventArgs e);
- 声明事件:在类中使用 event 关键字声明事件,事件类型为前面定义的委托类型。
class Publisher
{
public event MyEventHandler MyEvent;
}
事件的触发
- 在发布者类中,需要有一个方法来触发事件。通常,这个方法会在某个特定条件满足时被调用。
class Publisher
{
public event MyEventHandler MyEvent;
public void DoSomething()
{
// 模拟一些操作
Console.WriteLine("Publisher is doing something…");
// 触发事件
if (MyEvent!= null)
{
MyEvent(this, EventArgs.Empty);
}
}
}
事件的订阅与处理
- 订阅事件:订阅者类需要创建发布者类的实例,并使用 += 运算符将事件处理方法注册到事件上。
- 定义事件处理方法:事件处理方法必须与委托的签名一致。
class Subscriber
{
public void HandleEvent(object sender, EventArgs e)
{
Console.WriteLine("Subscriber received the event.");
}
}
class Program
{
static void Main()
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
publisher.MyEvent += subscriber.HandleEvent;
publisher.DoSomething();
}
}
- MyEventHandler 委托定义了事件处理方法的签名,接受 object 类型的 sender(表示事件的发送者)和 EventArgs 类型的参数(用于传递事件相关的数据,这里使用 EventArgs.Empty 表示不传递额外数据)。
- Publisher 类声明了一个 MyEvent 事件,并在 DoSomething 方法中触发该事件。
- Subscriber 类定义了 HandleEvent 方法来处理事件。
- 在 Main 方法中,创建了 Publisher 和 Subscriber 的实例,将 Subscriber 的 HandleEvent 方法注册到 Publisher 的 MyEvent 事件上,然后调用 publisher.DoSomething() 触发事件,此时 Subscriber 的 HandleEvent 方法会被执行。
使用预定义的委托和事件参数类型
- C# 提供了一些预定义的委托和事件参数类型,方便使用。例如,EventHandler 委托和 EventArgs 及其派生类。
- EventHandler 委托的定义为 public delegate void EventHandler(object sender, EventArgs e);,这是一个非常常用的事件委托类型。
- 当需要传递自定义数据时,可以从 EventArgs 派生一个新的类。例如:
public class CustomEventArgs : EventArgs
{
public string Message { get; set; }
public CustomEventArgs(string message)
{
Message = message;
}
}
public delegate void CustomEventHandler(object sender, CustomEventArgs e);
class CustomPublisher
{
public event CustomEventHandler CustomEvent;
public void RaiseCustomEvent()
{
if (CustomEvent!= null)
{
CustomEventArgs args = new CustomEventArgs("This is a custom message.");
CustomEvent(this, args);
}
}
}
class CustomSubscriber
{
public void HandleCustomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine($"Received custom event with message: {e.Message}");
}
}
class Program2
{
static void Main()
{
CustomPublisher publisher = new CustomPublisher();
CustomSubscriber subscriber = new CustomSubscriber();
publisher.CustomEvent += subscriber.HandleCustomEvent;
publisher.RaiseCustomEvent();
}
}
在这个示例中,CustomEventArgs 类从 EventArgs 派生,用于传递自定义消息。CustomPublisher 类使用 CustomEventHandler 委托声明 CustomEvent 事件,并在 RaiseCustomEvent 方法中触发事件并传递 CustomEventArgs 实例。CustomSubscriber 类的 HandleCustomEvent 方法接收并处理这个自定义事件和相关数据。


