C# event的使用
在C#中,事件(Event)是一种特殊的成员,它允许类或对象以类型安全的方式向外界发出通知,表明某个特定的行为或状态变化已经发生。
订阅该事件的其他类可以定义处理方法来响应这些通知。
事件主要基于委托机制实现,是C#编程中实现观察者模式和发布-订阅模型的关键部分。
以下是如何在C#中声明、引发(raise)和订阅事件的基本步骤:
声明事件
首先,你需要定义一个委托类型,这个委托类型对应事件处理方法的签名。然后使用event
关键字声明事件。
public delegate void MyEventHandler(object sender, EventArgs e); // 声明一个委托类型
public class PublisherClass
{
public event MyEventHandler MyEvent; // 声明一个事件
}
订阅事件
在订阅者类中,你可以通过.+=
操作符来添加一个事件处理方法到事件的订阅列表中。
public class SubscriberClass
{
private PublisherClass publisher;
public SubscriberClass(PublisherClass p)
{
publisher = p;
publisher.MyEvent += OnMyEvent; // 订阅事件
}
private void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("Event has been raised by " + sender.ToString());
// 这里执行事件处理逻辑
}
}
触发事件
在发布者类内部,当特定条件满足时,可以通过调用事件的.Invoke()
方法来触发事件。
public class PublisherClass
{
// ...
public void DoSomething()
{
// 当需要触发事件时
OnMyEvent?.Invoke(this, EventArgs.Empty);
}
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e); // 安全地引发事件,防止null引用异常
}
}
移除事件订阅
通过.-=
操作符可以取消对事件的订阅。
public class SubscriberClass
{
// ...
~SubscriberClass() // 或在适当的时候解除订阅
{
publisher.MyEvent -= OnMyEvent; // 取消订阅事件
}
}
注意点
- 使用
?.Invoke()
是为了避免在没有订阅者的情况下尝试调用事件导致的NullReferenceException。 OnMyEvent
是一个保护的虚方法,通常用于在类内部引发事件,子类可以根据需要重写此方法。- 事件名称通常以
On
开头,例如OnButtonClick
,遵循C#的命名规范。 - 事件参数通常是
EventArgs
或其派生类,包含与事件相关的信息。
- 事件只能使用
+=
操作符来订阅,使用-=
操作符来取消订阅。这确保了事件的封装性,即外部代码不能直接调用事件。 - 事件内部通常使用受保护的虚拟方法(如
OnMyEvent
)来触发事件,这样派生类可以重写事件触发逻辑。 - 事件的类型通常是委托类型,它定义了可以订阅事件的方法的签名。
- 自定义的事件参数类(如
MyEventArgs
)通常继承自EventArgs
类,并包含与事件相关的数据。