委托、事件和回调的关系

委托、事件和回调的关系

作者: 李艳庆

日期: 2006-04-26


  //执行第一种回调,委托回调
  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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值