实例理解自定义事件

来源:互联网 发布:数控编程学徒招聘 编辑:程序博客网 时间:2024/06/06 03:53

1. 事件的概念:事件是某个类中的一个成员,这个成员呢,可以告知给其它对象某种操作某种情况发生

了,然后被告知的对象可以做相应的回应。说白了也就是当一个对象的状态发生改变了的时候,通知其他

的对象发生了这么一件事。比如单击winForm上的按钮控件,那么这个按钮将被告知:用户点击了我。即然

点击了我,那我是不是应该需要做点事情呢,于是这个按钮将执行相应的某个操作,比如弹出一个提示对

话框等等以示收到通知后的响应。

 

由此可见,我们可以简单理解事件由其三要素构成:一是发布者Publisher,也就是触发事件的对象;二是订阅者Subscriber,即被通知的对象;三是事件处理程序,订阅者收到通知后一般会作出响应。在后面的示例代码中我们将一一找到它们。

 

2.       委托:在实现自定义事件时,我们将不得不提及另外一个概念,那就是委托delegate。它到底有什么作

用呢,其实委托本身也是一个class,是一个引用类型,是用来将某个方法封装在一个委托实例对象中,从

而实现将这个方法可以当成另外一个方法的参数进行传递。这种将方法以参数的形式动态地赋给另外一个

方法的做法,可以有效避免在程序中大量使用If-ElseSwitch这样的语句。下面请看一个经典的例子。

 

  

 

在上述实例main方法中,如果想要在GreetPeople方法中调用EnglishGreeting方法,我们就可将EnglishGreeting封装到委托实例delegateObject中,传给GreetPeople;如果想要在GreetPeople方法中调用ChineseGreeting方法呢,那就让delegateObject封装ChineseGreeting。这样岂不是很方便,让我们感谢委托对象delegateObject吧,正是因为它的存在,方法可以被当成参数传递来传递去了。

由于订阅事件时需要绑定事件处理函数,从而事件和委托变得息息相关。下面将切入本篇主题如何自定义事件。

 

3.       自定义事件:事件有关键字event修饰,它的类型是delegate。为了更好理解下面代码的流程,我们先

捋捋自定义事件的步聚:

 

a)定义delegate对象类型,也就是事件的原型。它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。
b)定义事件参数类,此类必须从System.EventArgs类派生。如果事件不需要额外的参数,这一步可以省略。

c)定义发布者Publishser类。其中包括用用event关键字定义事件对象以及触发事件的方法。

d)定义订阅者Subscriber类。其中主要是事件处理函数,也就是对事件响应的函数。
e)+=操作符(或使用add/remove)绑定事件,也即订阅者去订阅发布者发布的事件,只有订阅了的对象才能收到事件发生的通知。(-=操作符能够将事件从队列中删除)。

f)当发布者某种状态发生改变时,事件就会被触发,订阅了该事件的订阅者就会收到消息,然后去执行事件处理程序。

 

 

 

先看事件NameChanged的原型NameChangedEventHandler,它有两个参数sender代表事件发送者(本例中即指pub对象),e存储了附加的事件参数信息。Main方法中定义了三个事件订阅者sub1sub2sub3,而发布者就是pub,当pubname值改为”Chinese publisher”NameChanged事件就被触发了,这时,只有订阅者sub1sub2则会收到通知来执行事件处理函数OnNameChanged,而sub3是不会收到通知,因为它没有订阅这个NameChanged事件。