首页 >> C#.NET >> 正文
编程入门网-介绍.NET中的委派(Delegates)之一
来源:互联网 作者:赵湘宁 时间:2008-4-1

回调函数

   回调函数的确是至今为止最有用的编程机制之一。C运行时的qsort函数利用回调函数对数组元素进行排序。在Windows中,回调函数更是窗口过程,钩子过程,异步过程调用,以及目前Microsoft .NET框架所必需的,在整个回调过程中自始至终地使用回调方法。人们可以注册回调方法以获得加载/卸载通知,未处理异常通知,数据库/窗口状态修改通知,文件系统修改通知,菜单项选择,完成的异步操作通知,过滤一组条目等等。

   在C/C++中,一个函数的地址就是内存地址。这个地址不会附带任何其它赋加信息,如函数的参数个数,参数类型,函数的返回值类型以及这个函数的调用规范。简言之,C/C++回调函数不是类型安全的。

   在.NET框架中,回调函数所受到的重用与它在Windows非受控编程中一样。不同的是在.NET框架中提供了一种叫委派(delegates)的类型安全机制。我们先来研究一下委派的声明。下面的代码展示了如何声明,创建和使用委派:

//

using System;

using System.WinForms; // 在beta2版本中为: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,类型为delegate

// (注意: 这个类型在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 {

[STAThreadAttribute]

static void Main() {

StaticCallbacks();

InstanceCallbacks();

}

static void StaticCallbacks() {

// 创建一个Set对象,其中有五个项目

Set setOfItems = new Set(5);

// 处理项目,feedback=null

setOfItems.ProcessItems(null);

Console.WriteLine();

// 处理项目,feedback=Console

setOfItems.ProcessItems(new Set.Feedback(App.FeedbackToConsole));

Console.WriteLine();

// 处理项目,feedback =MsgBox

setOfItems.ProcessItems(new Set.Feedback(App.FeedbackToMsgBox));

Console.WriteLine();

// 处理项目,feedback = console AND MsgBox

Set.Feedback fb = null;

fb += new Set.Feedback(App.FeedbackToConsole);

fb += new Set.Feedback(App.FeedbackToMsgBox);

setOfItems.ProcessItems(fb);

Console.WriteLine();

}

static void FeedbackToConsole(

Object value, Int32 item, Int32 numItems) {

Console.WriteLine("Processing item {0} of {1}: {2}.",

item, numItems, value);

}

static void FeedbackToMsgBox(

Object value, Int32 item, Int32 numItems) {

MessageBox.Show(String.Format("Processing item {0} of {1}: {2}.",

item, numItems, value));

}

static void InstanceCallbacks() {

//创建一个Set对象,其中有五个元素

Set setOfItems = new Set(5);

// 处理项目,feedback=File

App appobj = new App();

setOfItems.ProcessItems(new Set.Feedback(appobj.FeedbackToFile));

Console.WriteLine();

}

void FeedbackToFile(

Object value, Int32 item, Int32 numItems) {

StreamWriter sw = new StreamWriter("Status", true);

sw.WriteLine("Processing item {0} of {1}: {2}.",

item, numItems, value);

sw.Close();

}

}

//

   注意代码最上面的Set类。假设这个类包含一组将被单独处理的项目。当你创建Set对象时,将它要操纵的项目数传递给它的构造函数。然后构造函数再创建对象(Objects)数组并初始化每一个整型值。

   另外,Set类定义了一个公共的委派,这个委派指出某个回调函数的签名。在这个例子中,委派Feedback 确定了一个带三个参数的方法(第一个参数为Object,第二和第三个参数都是Int32类型)并且返回void。在某种意义上,委派很像C/C++中表示某个函数地址的类型定义(typedef)。

   此外,Set类定义了一个公共方法:ProcessItems。这个方法有一个参数feedback——一个对委派Feedback 对象的引用。ProcessItems迭代遍历所有的数组元素,并且针对每一个元素调用回调方法(由feedback变量指定哪一个会调方法),这个回调方法被传递,从而以不同的方式处理回调方法所传递的项目值,项目数量以及数组中的元素数目。可以看出回调方法能以它选择的任何方式处理每一个项目。

下一节“介绍.NET中的委派(Delegates)”

相关新闻
相关评论
 
评论表单加载中...
 
C#.NET文章

 在Visual C++应

 编辑:admin

 时间:2008-3-10


   编程入门网-介绍.NET中的委派(Delegates)之三
   编程入门网-介绍.NET中的委派(Delegates)之二
   编程入门网-介绍.NET中的委派(Delegates)之一
   编程入门网-用Visual C#实现文件下载功能
   编程入门网-用C#写简单的CGI程式
最新文章
   编程入门网-介绍.NET中的委派(Delegates)之三
   编程入门网-介绍.NET中的委派(Delegates)之二
   编程入门网-介绍.NET中的委派(Delegates)之一
   编程入门网-用Visual C#实现文件下载功能
   编程入门网-用C#写简单的CGI程式
总站搜索
搜索
 
热门文章
   oracle数据库文件中的导入\导出
   用Oracle10g列值掩码技术隐藏敏感数据
   VB程序中用ADO对象动态创建数据库和表-VB.NET
   用VB6写简单程序 让电骡自动关机-VB.NET
   使用.NET2.0编写COM组件供VB调用-VB.NET
   VB.NET:键盘控制焦点移动-VB.NET
   用VB.NET绘制GDI图形-VB.NET
   vb.net中应用 ArrayList 实例-VB.NET
 
推荐文章
ASP.NET中的状态管理-ASP.NET
VC、IE、ASP环境下打印、预备的完美解决方案
oracle数据库文件中的导入\导出
VB.NET中快速访问注册表技巧-VB.NET
在vb中实现超连接的方法!和直接发邮件-VB.NET
用VB做realplayer播放列表-VB.NET
在VB.NET中如何实现和利用SortedLists-VB.NET
利用VB.NET Stopwatch对象记录时间-VB.NET
成都古羌科技有限公司版权所有: Copyright@2007-2010 ,ALL Rights Reserved 蜀ICP备07017240号