日期:2014-05-17  浏览次数:20963 次

C#学习笔记——事件

?

事件

事件和委托相似

事件的很多方面和委托相似。其实,事件就好像被简化的针对特殊用途的委托。

注册到事件上的方法会在事件触发时被调用。

下面是一些有关事件的重要事项。

触发( raisc)事件:调用(invoke)或触发(fire)事件的术语。当事件被触发时,所有注册到它的方法都会被依次调用。

发布者

订阅者

事件处理程序:注册到时间的方法。可以在事件所在的类或结构中,或者在不同的类或结构中。

?

?

事件有私有委托

??? 委托和事件的行为之所以相似,是有充分理由的。事件包含了一个私有的委托。有关事件的私有委托需要了解的重要事项如下:

??? 事件提供了对它的私有控制委托的结构化访问。

??? 与委托中的其他操作不一样,对于事件我们只可以添加、删除或调用事件处理程序。

事件被触发时,它调用委托来依次调用调用列表中的方法。

?

源代码组件概览

??? 需要在事件中使用的代码有5部分。

委托类型声明:事件和时间处理程序必须有共同的前面和返回类型,它们通过委托类型声明进行描述。

事件处理程序声明:这些在订阅者类的方法(事件处理程序)中的描述会在事件触发时被执行。它们不需要有独立的方法,它们可以是匿名方法或lambda表达式。

事件声明:这个事件发布者类中的声明保存并调用事件处理程序。

事件注册:这段代码把事件连接到事件处理程序。

触发事件的代码:发布者类中的这段代码调用事件导致它调用事件处理程序。

?

声明事件

发布者类必须提供事件和触发事件的代码

创建事件比较简单。只需要委托类型和名字。

?

例:

事件声明的语法如下代码所示,代码中声明一个叫做Elaspsed的时间。注意如下有关Elaspsed事件的内容:

声明在一个叫做MyTimeClass的类中。

它接受返回类型和签名与EventHandler委托类型匹配的事件处理程序。

它被声明为public,于是其他类和结构可以在这上面注册事件处理程序。

?

class MyTimeClass

{

public event EventHandler Elapsed;

?

}

?

可以通过使用逗号分隔的列表在一个声明语句中声明一个以上的事件。

例:

public event EventHandler MyEvent1, MyEvent2,OtherEvent;

?

我们还可以使用static关键字让事件变成静态的:

public static event EventHandler Elapsed;

?

?

事件是成员

事件不是类型,事件是成员。这点引出几个重要特性。

由于时间不是类型,我们不能使用对象创建表达式(