(原创)c#学习笔记06--函数06--委托

6.6  委托

  委托(delegate)是一种可以把引用存储为函数的类型。这听起来相当棘手,但其机制是非常简单的。委托最重要的用途在本书后面介绍到事件和事件处理时才能解释清楚,但这里也将介绍有关委托的许多内容。委托的声明非常类似于函数,但不带函数体,且要使用 delegate 关键字。委托的声明指定了一个返回类型和一个参数列表。

  在定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。

  有了引用函数的变量后,还可以执行不能用其他方式完成的操作。例如,可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数,而且在运行之前无需知道调用的是哪个函数。下面的示例使用委托访问两个函数中的一个。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ch06Ex05
{
    class Program
    {
        delegate double ProcessDelegate(double param1, double param2);  // 定义delegate

        static double Multiply(double param1, double param2) {
            return param1 * param2;
        }

        static double Divide(double param1, double param2)
        {
            return param1 / param2;
        }

        static void Main(string[] args)
        {
            ProcessDelegate process;  // 声明delegate变量
            Console.WriteLine("Enter 2 numbers separated with a comma:");
            string input = Console.ReadLine();
            int commaPos = input.IndexOf(',');
            double param1 = Convert.ToDouble(input.Substring(0, commaPos));
            double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1));
            Console.WriteLine("Enter M to multiply or D to divide:");
            input = Console.ReadLine();
            if ("M" == input)
            {
                process = new ProcessDelegate(Multiply);  // 初始化delegate变量,注意参数
            }
            else
            {
                process = new ProcessDelegate(Divide);  // 初始化delegate变量,注意参数
            }
            Console.WriteLine("Result: {0}", process(param1, param2));
            Console.ReadKey();
        }
    }
}

  运行结果如下:

  初始化process委托变量:

      if (input == "M") 
          process = new ProcessDelegate(Multiply); 
      else 
          process = new ProcessDelegate(Divide);

  注意这个参数与委托类型或目标函数的参数不匹配,这是委托赋值的一个独特语法,参数是要使用的函数名,且不带括号。

  实际上,这里可以使用略微简单的语法:

if (input == "M") 
          process = Multiply; 
else 
          process = Divide;

  编译器会发现,process变量的委托类型匹配两个函数的签名,于是自动产生化一个委托。可以自行确定使用哪个语法,但一些人喜欢使用较长的版本,因为它更容易一眼看出会发生什么。

  这里把委托变量看作一个函数名。但与函数不同,我们还可以对这个变量执行更多的操作,例如,通过参数将其传递给个函数,这个函数的一个简单示例如下:

      static void ExecuteFunction(ProcessDelegate process) 
      { 
          process(2.2, 3.3); 
      }

  像选择一个要使用的“插件”一样,把它们传递给函数委托,就可以控制函数的执行。例如,一个函数要对字符串数组按照字母进行排序。对列表排序有几个不同的方法,它们的性能取决于要排序的列表特性。使用委托可以把一个排序算法函数委托传递给排序函数,指定要使用的方法

原文地址:https://www.cnblogs.com/wodehao0808/p/4914058.html