登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

【华软英创工作室】-潇湘客

QQ:1917141 E-Mail:dengzebo@163.com

 
 
 

日志

 
 
关于我

朝起晨风暮斜阳,为谁辛苦为谁忙? 夏雨梧桐秋棋声,待到何时待何人? 风飒飒兮木萧萧,思公子兮徒离忧。 山有木兮木有枝,心悦君兮君不知。

 
 

委托、事件和回调的关系  

2007-10-23 22:45:51|  分类: 设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


 

  //执行第一种回调,委托回调
  object obj = test.HandleString("邓", "泽波", new CallBackTest.CallBackDelegate(client.CallBackFunction));
  string str = obj as string;
  Console.WriteLine(str);
  
  //执行第二种回调,事件回调
  object obj2 = test.EventHappen("邓", "泽波");
  string str2 = obj2 as string;
  Console.WriteLine(str2);
 }
 public object CallBackFunction(string value)
 {
  return ("hello  " + value);
 }
}

执行后,结果将显示什么呢?下面为显示的结果.
hello 邓 泽波
hello 邓 泽波

可以看到两种回调产生的结果是一致的.两种回调方式,一种是直接使用委托实例,另一种是使用委托定义的事件.
从这里可以看出,在.NET编程中,我们其实经常在使用回调.只要有事件,它就存在.
    但是在事件的设计中,按照习惯的形式,事件总是被设计成为不返回任何值,即用void修饰(虽然它实际可以返回某个值或对象),并且事件的参数,习惯上使用两个参数,一个标识了事件的发送者,另一个则为System.EventArgs类型.因为在使用回调时,就倾向于第一种回调方式.直接使用更为简洁的委托实例进行回调.

    在Windows的编程,经常会使用于系统的API函数,有一些API函数使用了回调方法.记得刚开始使用带回调函数的API时,经常把自己搞得晕头转向,不是这里出错,就是那里不对,而且充满着危险性.
    在.NET中,则要好的多,可以进行安全的回调,不必再担心会出什么差错.在.NET中,有多种方法可以使用回调技术,比如通过接口.在这里,我将谈谈通过委托和事件来实现回调.
    在讨论之前,先设计一个类,它里面将包含委托和事件.
public class CallBackTest
{
 public delegate object CallBackDelegate (string value);  //声明一个委托,通过它将实现一个回调
 public delegate object CallBackEventHandler (string value);  //声明一个实现事件的委托
 public event CallBackEventHandler CallBackEvent;  //声明一个事件,用来实现回调
 public CallBackTest()
 {
 }
        //该方法处理两个字符串,将它们相加,中间用空格隔开
        //在方法的参数中,有一个为委托的实例,由它与实际执行代码相关联
 public object HandleString(string str1, string str2, CallBackDelegate callBack)
 {
  string str = str1 + " " + str2;
  return callBack(str);
 }
        //该方法与上面的方法相同,也是处理两个字符串
        //而且方法中将触发一个事件
 public object EventHappen(string str1, string str2)
 {
  string str = str1 + " " + str2;
  return CallBackEvent(str);
 }
}
有了进行回调的方法,接下来,要实现回调方法的实际代码.
下面这个类中,包含了一个主程序入口,并在其中执行了两种回调.
public class Client
{
 public static void Main()
 {
  Client client = new Client();
  CallBackTest test = new CallBackTest();
  //添加一个事件,其实也就是定义好一个回调.
  test.CallBackEvent += new CallBackTest.CallBackEventHandler(client.CallBackFunction);
  评论这张
 
阅读(1438)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018