您的位置:首页 - 教程 - C# - 正文
C#事件

自从上一次自己写了一篇对委托的理解之后,剩下的一半-对事件的理解现在才写出来,也是拖得够久了。现在我们一起来看看C#的事件吧


首先:为什么要有事件?

上一篇文章展示了如何声明委托,调用委托和创建委托的实例。然而,这时委托虽然可以间接调用任意数量的方法,但是我们必须显式地调用委托,大部分时间,我们需要在特定事件发生时,自动执行委托,就如中介的例子,我们交代中介帮我们卖房子,当有客户来的咨询的时候,中介会自己主动带客户去了解房子,而不是每次还需要我们去告诉他,你应该带客户去看房子。既然委托类似中介,我们就应该让他有自主的能力。所以事件产生了。

其次:如何声明事件?

声明事件的方式和字段差不多的,不过大家要注意,委托是和事件一起的。所以事件的类型必须是委托。如下:

Event DelegateName EventName;

接着:订阅事件

我们需要事件是因为当这个事件发生时,要引起一些其他变化。当某一个或多个方法订阅了该事件后,该事件发生时,就会调用所有订阅了该事件的方法。

进行订阅的这个代码和委托添加方法类似。如下:

EvenName+=LeadToEvent();

取消订阅:

EvenName-=LeadToEvent();

最后:引发事件

引发事件就像调用方法一样。引发了该事件,订阅了该事件的方法都会被调用。


现在我们来让Demo说话吧

1.新建一个MyEventDemo的控制台应用程序:

image

2.我们新建一个类。声明自己的委托和事件并添加一个引发事件的方法OnMyEvent

image

3.我们再新建一个类,里面添加一些需要订阅事件的方法

image

4.在Main函数实例化这两个类,并让两个方法去订阅这个事件

image

5.我们假设有一个事情调用了OnMyEvent,然后由于OnMyEvent被调用就会引发MyEvent事件。然后就会调用订阅了该事件的方法

image

6.运行程序

image

我们可以看到,这两个订阅了MyEvent事件的方法Show和Show2被调用了。

以上就演示了一个基本的事件。

PS:以下几点是我自己总结的需要注意的方面

1.最好把事件对应的委托声明和事件的声明放在同一个类中。

2.引发事件的方法也和事件放在同一个类中。

3.订阅事件的方法的参数应该和对应的委托的参数相同。

4.一个方法可以订阅多个事件,一个事件可以被多个方法订阅。


如果需要更深入了解事件,大家可以看一下winform中的onclick事件。机制一样,不过是订阅事件的方法的参数通常是两个(object sender,EvenetArgs args)。以上有错误欢迎大家指正!!


评论: