委托、事件和回调的关系

 //执行第一种回调,委托回调
  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);

 

转自:http://dengzebo.blog.163.com/blog/static/18867406200792310455166/

posted @ 2012-05-03 07:45  农十四  阅读(1435)  评论(0)    收藏  举报