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