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

C#:委托与事件

委托

委托类似于C/C++中的函数指针,它能够引用函数,但在C#中委托是一个对象,且是安全的。一个委托类型的变量可以引用一个或多个方法,这些方法由委托存放于一个调用列表中,当调用一个委托类型的变量即相当于依次调用它调用列表中的方法。

委托是引用类型,事实上每一个委托都默认继承自System.MulticastDelegate(该类是抽象类),而System.MulticastDelegate又继承自System.Delegate类。

C#中使用委托分三步:

1.定义委托:它和方法的定义类似,只是在返回值类型的前面多了一个delegate关键字,例如

public delegate void PrintDelegate(string content);

注意委托类型可以引用的方法需要满足两个规则:方法的签名和委托一致,比如方法参数的个数和类型;方法的返回值要和委托一致。

2.实例化委托:使用构造函数或者”=”运算符将要引用的方法赋值给委托变量,例如

void Process(string msg)

{

    System.Console.WriteLine(msg);

}

PrintDelegate delObject = new PrintDelegate(Process);

或者

PrintDelegate delObject = Process;

3.调用委托:利用委托实例调用所指向的方法,例如

delObject(“Hello World!”);

添加多个方法到委托的调用列表中,以上例为演示,为委托添加方法Process2

void Process2(string msg)

{

//方法处理

}

delObject += Process2;

从委托的调用列表中移除方法,以上例为演示,为委托移除方法Process

delObject -= Process;

事件

事件涉及两类角色:事件发布者和事件订阅者。当某个事件发生后,事件发布者会发布消息,事件订阅者会收到事件发生的通知,并做出相应处理。

事件与委托的关系

在事件触发以后,事件发布者要发布消息,通知事件订阅者进行事件处理,但事件发布者不知道要通知哪些事件订阅者,这就需要在发布者和订阅者之间存在一个中介,这个中介就是委托。委托包含一个调用列表,各个事件订阅者需将自己的事件处理程序加入到该列表中,那么在事件触发时,发布者只需调用委托即可触发订阅者的事件处理程序。

定义事件(演示说明如下)

public event EventHandler PrintComplete;

event:是事件定义的特殊关键字

EventHandler:是预定义的委托类型,也可采用自定义的委托类型,该委托的签名如下:

public delegate void EventHandler(Object sender,EventArgs e);//send