0%

【C#】委托和事件


①委托

1.委托像是一种特殊的类,这种类只能存储方法,不存储字段属性,而且它是存储别的对象的方法。(储存没有类的“野方法”用lambda表达式) 2.委托这种类还可以被直接执行,它执行起来就像一个方法,只不过实际上它是在执行别的对象的方法。

委托的声明

委托使用关键字delegate声明,声明时,还要包括委托包含的方法的返回类型传入值,若声明一个委托为Act,且其无返回值(void),无传入值,如下:

delegate void Act();

委托的定义

声明委托后即可对其进行定义,刚刚声明了委托类,下面还要具体定义该类下的“委托对象”,即“成员”。如下:

Pet pet=new Pet(); Act act=Pet.Speaking;//声明成员后添加第一个方法
act+=Pet.Feed;//为成员添加第二个方法

注意这里传入pet对象的Speaking方法时并没有带方法后常加的括号,这是因为我们在声明委托时就定义了此中包含的方法不能有传入参数。 注意同一个委托对象可以同时包含静态与非静态方法,只不过包括静态方法是”类.方法“而非静态方法是”对象.方法“。 使用“+=”添加超过一个方法,使用“-=”删去一个方法。 这样以来,成员act就可以传入多个不同对象的方法,委托也可以多次声明出不同的成员。

调用委托

调用委托时,直接写出要调用的成员名加传入参数即可,如上面的例子,调用act即为

act();

形式与调用了一个方法很相似。

②Lambda表达式

Lambda表达式由匿名方法进化而来,它允许用户往委托中存储“没有类的野方法” 语法: 以①中的act“委托对象”为例,我们使用lambda表达式为它添加一个“没有类的野方法”:

act=()\=>{…}

这样,在运行act“委托对象”时,{…}中的内容也会被运行。

③事件

事件的通知需要有事件的“发布者”与事件的“订阅者”。 事件发生时,通知订阅者,就是调用订阅者的“注册函数”。注册,就是告诉发布者调用哪个注册函数

事件的声明

事件实际上就是对一个委托进行了声明(委托→成员),既然如此必须先有被声明的委托,然后使用关键字event对其进行声明。如下例,就将Handler委托声明成了NewDog事件。

delegate void Handler();
public event Handler NewDog;

需要注意的是使用事件声明委托后其会被隐式自动初始化为null,所以之后的添加方法需要使用“+=”。 方法可以是实例方法、静态方法、Lambda表达式。

触发事件

需要触发事件(广播事件)时,就可以使用

if(NewDog!=null)//如果NewDog事件不为空(无方法接收)
{
NewDog();(广播事件/调用NewDog包括的方法)
}