C# 委托(学习笔记)

164 阅读2分钟

委托(delegate)是一种存储函数引用的类型。这听起来相当深奥,但其机制是非常简单的。委托最重要的用途在介绍到事件和事件处理时才能解释清楚。委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。 委托的声明指定了一个返回类型和一个参数列表。定义了委托后,就可以声明该委托类型的变量。接着把这个变量初始化为与委托具有相同返回类型和参数列表的函数引用。之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。 有了引用函数的变量后,就可以执行无法用其他方式完成的操作。 例如,可以把委托变量作为参数传递给一个函数,这样,该函数就可以使用委托调用它引用的任何函数,而且在运行之前不必知道调用的是哪个函数。

下面的示例使用委托访问两个函数中的一个,新建控制台项目,代码如下:

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

using static System.Console;
using static System.Convert;

namespace Ch06Ex05
{
    class Program
    {
        delegate double ProcessDelegate(double param1, double param2); // 委托的声明指定了一个返回类型和一个参数列表
        static double Multiply(double param1, double param2) => param1 * param2;
        static double Divide(double param1, double param2) => param1 / param2;

        static void Main(string[] args)
        {
            ProcessDelegate process;  //声明该委托类型的变量
            WriteLine("Enter 2 numbers separated with a comma:");
            string input = ReadLine();
            int commaPos = input.IndexOf(',');
            double param1 = ToDouble(input.Substring(0, commaPos));
            double param2 = ToDouble(input.Substring(commaPos + 1,
                                             input.Length - commaPos - 1));
            WriteLine("Enter M to multiply or D to divide:");
            input = ReadLine();
            if (input == "M")
                process = new ProcessDelegate(Multiply);  //委托类型的变量初始化为与委托具有相同返回类型和参数列表的函数引用
            else
                process = new ProcessDelegate(Divide);   //委托类型的变量初始化为与委托具有相同返回类型和参数列表的函数引用
            WriteLine("Result: {0}", process(param1, param2));  //使用委托变量调用一个函数
            ReadKey();
        }
    }
}

摘至 《c#入门经典第七版》