C#之委托概念认识学习笔记

回调函数是一项非常有用的编程机制,它在程序设计界的应用已有很多年了。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();

         }

        ...

}

未完待续

原文地址:https://www.cnblogs.com/yjrl/p/1657812.html