C#:委托与事件
2013-03-31 00:17
323 查看
委托
委托类似于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);//sender保存触发事件的对象引用,EventArgs保存事件数据
PrintComplete:是事件的名称
订阅事件
事件订阅者需要订阅事件发布者发布的事件,才能在事件发布时接收到消息并做出响应。事件事实上是委托类型,因此事件处理方法必须和委托签名相匹配。如:事件使用预定义的委托类型EventHanlder,则匹配它的事件处理方法可如下:
public void SomeEventHandler(Object sender,EventArgs e)
{
…
}
有了事件处理方法,就可以订阅事件了。演示如下:
eventSample. PrintComplete += SomeEventHandler; //这里假设eventSample为一个拥有PrintComplete事件的对象
取消事件订阅则如下所示:
eventSample. PrintComplete -= SomeEventHandler;
触发事件(代码演示如下)
if(PrintComplete != null) //检查事件是否绑定了事件处理方法
{
PrintComplete(this,new EventArgs()); //this指的是事件触发者
}
委托类似于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);//sender保存触发事件的对象引用,EventArgs保存事件数据
PrintComplete:是事件的名称
订阅事件
事件订阅者需要订阅事件发布者发布的事件,才能在事件发布时接收到消息并做出响应。事件事实上是委托类型,因此事件处理方法必须和委托签名相匹配。如:事件使用预定义的委托类型EventHanlder,则匹配它的事件处理方法可如下:
public void SomeEventHandler(Object sender,EventArgs e)
{
…
}
有了事件处理方法,就可以订阅事件了。演示如下:
eventSample. PrintComplete += SomeEventHandler; //这里假设eventSample为一个拥有PrintComplete事件的对象
取消事件订阅则如下所示:
eventSample. PrintComplete -= SomeEventHandler;
触发事件(代码演示如下)
if(PrintComplete != null) //检查事件是否绑定了事件处理方法
{
PrintComplete(this,new EventArgs()); //this指的是事件触发者
}
相关文章推荐
- C# 中的委托和事件
- C# 中的委托和事件
- 黑马程序员:C#基础篇(三)委托与事件
- C#中的委托和事件(续)----转自---http://www.cnblogs.com/JimmyZhang/
- C# 中的委托和事件
- C# 委托,事件(一)
- C# 中的委托和事件
- c#中的委托与事件
- C#中的委托和事件(续)
- c#事件,委托机制 这个例子非常好哦.提供源码,.一下子就了解了,还推荐去看 皮特的故事 要学委托 事件的话,
- 【C#系列】你应该知道的委托和事件
- c# 删除事件委托
- 大白话系列之C#委托与事件讲解(三)
- C#,由委托到Observer设计模式,再到事件机制
- c# 委托与事件的区别
- C#中的委托和事件
- C# 中的委托和事件
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同.
- C#编程之委托与事件(二)
- C# winform窗体间传值(使用委托或事件)