在C#中,事件(Events)是一种使类或对象能够提供通知的机制。当某个重要事情发生时(比如用户点击了一个按钮、数据发生变化等),事件的发布者(通常是一个类)会通知事件的所有订阅者(也称为事件处理器或事件监听器)。这样,订阅者就可以对这些事件做出响应。
事件的组成部分
- 事件发布者(Event Publisher):这是定义并触发事件的类或对象。
- 事件(Event):这是一个特殊的成员,它封装了事件发布者和订阅者之间的通信。
- 事件处理器(Event Handler):这是当事件发生时被调用的方法。事件处理器需要符合特定的签名,这个签名由事件定义时指定。
- 事件订阅者(Event Subscriber):这是订阅(或监听)事件的对象。订阅者通过为事件提供事件处理器来订阅事件。
如何定义和使用事件
定义事件
在C#中,事件通常是通过event
关键字声明的,并且其类型是一个委托(Delegate)。委托定义了事件处理器的签名。
public class MyEventPublisher
{// 声明事件处理器委托public delegate void MyEventHandler(object sender, EventArgs e);// 声明事件public event MyEventHandler MyEvent;// 触发事件的方法protected virtual void OnMyEvent(EventArgs e){MyEventHandler handler = MyEvent;if (handler != null){handler(this, e);}}// 在某处调用OnMyEvent来触发事件public void DoSomething(){// ... 做一些工作OnMyEvent(EventArgs.Empty);}
}
订阅事件
任何对象都可以订阅MyEventPublisher
类的事件,只要它实现了MyEventHandler
委托定义的方法签名。
class Program
{static void Main(string[] args){MyEventPublisher publisher = new MyEventPublisher();// 订阅事件publisher.MyEvent += new MyEventPublisher.MyEventHandler(MyEventHandlerMethod);// 触发事件publisher.DoSomething();}static void MyEventHandlerMethod(object sender, EventArgs e){Console.WriteLine("事件被触发!");}
}
取消订阅事件
取消订阅事件也非常简单,只需使用-=
操作符即可。
publisher.MyEvent -= MyEventHandlerMethod;
使用.NET内置的事件模式
在.NET中,许多类都遵循了一个标准的事件模式,其中EventHandler
和EventArgs
是常用的委托和类。使用这些内置的类和委托可以让你的代码更加标准化和易于理解。
public event EventHandler MyEvent;// 触发事件
protected virtual void OnMyEvent(EventArgs e)
{EventHandler handler = MyEvent;handler?.Invoke(this, e);
}
这种方式利用了C# 6.0引入的空合并运算符?.
来简化空检查。如果MyEvent
不为null
,则调用Invoke
方法;否则,什么也不做。