一、事件的使用步骤
定义委托(如果需要):
如果没有合适的预定义委托,就需要定义一个委托来匹配事件处理程序的签名。例如,public delegate void MyEventHandler(int value);
定义了一个名为MyEventHandler
的委托,它表示一个返回值为void
且带有一个int
类型参数的方法。
定义事件:
在发布者类中,使用委托定义事件。例如,public event MyEventHandler MyEvent;
定义了一个名为MyEvent
的事件,其类型是MyEventHandler
委托。
订阅事件:
在订阅者类中,通过+=操作符来订阅事件。例如,假设publisher
是发布者对象,subscriber
是订阅者对象,并且subscriber
有一个名为HandleMyEvent
的方法(其签名符合MyEventHandler
委托),则可以使用publisher.MyEvent += subscriber.HandleMyEvent;
来订阅事件。
触发事件:
当发布者中的某个条件满足时通过调用事件来触发它。通常使用MyEvent?.Invoke(sender, args);
的形式,其中sender
是触发事件的对象(通常是发布者本身),args
是事件参数,?
操作符是为了防止事件为空(没有订阅者)时引发异常。
二、事件参数(EventArgs)
EventArgs是一个基类,用于传递事件相关的信息。它可以被继承来创建自定义的事件参数类。例如,MouseEventArgs
继承自EventArgs
,用于在鼠标相关的事件(如MouseClick
、MouseMove
等)中传递鼠标的位置、按钮状态等详细信息。
标准的EventHandler
委托的第二个参数类型是EventArgs
。当定义自定义事件时,如果不需要传递额外的信息,可以直接使用EventArgs.Empty
作为参数。
三、事件的优势
解耦对象之前的关系:
事件使得发布者和订阅者之间的耦合度降低。发布者不需要知道哪些对象会订阅它的事件,订阅者也不需要知道事件是如何被触发的细节。它们只需要遵循事件的契约(委托的签名)。
提高代码的可维护性和可扩展性:
可以方便地添加或移除订阅者,对事件处理逻辑进行修改,而不会影响到其他部分的代码。例如,在一个大型的企业级应用程序中,不同的模块可以通过事件来进行通信,当需要添加新的功能时,只需要订阅相应的事件并实现处理逻辑即可。
C#练习25