回调函数是一项非常有用的编程机制,它在程序设计界的应用已有很多年了。Microsoft。NET框架使用一种称作委托(delegate)的技术来提供回调函数机制。与其他平台中使用的回调机制不同,委托为我们提供了更多的功能。例如,委托可以确保回调方法是类型安全的(这是通用语言运行时最重要的目标之一)。委托还集成了按序调用方法的能力,并且同时支持调用静态方法和实例方法。
认识委托
C语言运行时中的qsort就是利用回调函数来对一个数组中的元素进行排序的。在windows中,窗口过程、钩子过程、异步过程调用等都要求使用回调函数。在.NET框架中,回调方法也用于很多场合。例如,我们可以通过登记回调方法来获得各种各样的通知,如未处理的异常、窗口状态的改变、菜单项目的选中、文件系统的变更以及异步操作的完成等。
在非托管C/C++中,函数的地址就是一个内存地址。该地址不会携带任何额外的信息,例如函数期望的参数个数、参数类型、函数的返回值类型以及函数的调用约定。一言以避之,非托管C/C++中的回调函数时非类型安全的。
在.NET框架中,回调函数仍然像在非托管windows编程中一样有用和普遍。但是,.NET框架为回调函数提供了一种称为委托(delegate)的类型安全的机制。在详细讨论委托之前,首先向大家展示一下他们的使用方法。下面的代码演示了怎样声明、创建和使用委托。
using System;
using System.Windows.Forms;
using System.IO;
class Set{
private Object[] items;
public Set(Int32 numItems){
items=new Object[numItems];
for(Int32 i=0;i<numItems;i++){
items[i]=i;
}
//定义一个Feedback委托类型
//注意:该类型嵌套在Set类中
public delegate void Feedback(Object value,Int32 item,Int32 numItems);
public void ProcessItems(Feedback feedback){
for(Int32 item=0;item<items.Length;item++){
if(feedback!=null){
//如果指定有回调函数,则调用它们
feedback(items[item],item+1,items.Length);
}
}
}
}
class App{
static void main(){
StaticCallbacks();
InstanceCallbacks();
}
...
}
未完待续