事件的含义
事件类似于异常,因为它们都由对象引发(抛出),并且都可以通过我们提供的代码来处理。但它们也有几个重要的区别。最重要的区别是并没有与try…catch类似的结构来处理事件,而必须订阅(subscribe)它们。订阅一个事件的含义是提供代码,在事件发生时执行这些代码,它们称为事件处理程序。
单个事件可供多个处理程序订阅,在该事件发生时,这些处理程序都会被调用,其中包括引发该事件的对象所在的类中的事件处理程序,但事件处理程序也可能在其他类中。
事件处理程序本身都是简单方法。对事件处理方法的唯一限制是它必须匹配事件所要求的返回类型和参数。这个限制是事件定义的一部分,由一个委托指定。
在事件中使用委托是非常有用的。第6章介绍了委托,读者可以温习这一部分,复习一下委托是什么以及如何使用它们。
基本处理过程如下所示:首先,应用程序创建一个可以引发事件的对象。例如,假定一个即时消息传送(instant messaging)应用程序创建的对象表示一个远程用户的连接。当接收远程用户通过该连接传送来的消息时,这个连接对象会引发一个事件,如图13-2所示。
接着,应用程序订阅事件。为此,即时消息传送应用程序将定义一个方法,该方法可以与事件指定的委托类型一起使用,把这个方法的一个引用传送给事件,而事件的处理方法可以是另一个对象的方法,例如当接收到消息时进行显示的显示设备对象,如图13-3所示。
引发事件后,就通知订阅器。当接收到通过连接对象传来的即时消息时,就调用显示设备对象上的事件处理方法。因为我们使用的是一个标准方法,所以引发事件的对象可以通过参数传送任何相关的信息,这样就大大增加了事件的通用性。在本例中,一个参数是即时消息的文本,事件处理程序可以在显示设备对象上显示它,如图13-4所示。