委托类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。
委托是一种存储函数引用的类型。
委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。
委托的声明指定了一个返回类型和一个参数列表
定义了委托之后就可以声明该委托类型的变量。接着把这个变量初始化为与委托具有相同返回类型和参数列表的函数引用。
之后就可以使用委托变量调用这个函数,就像该变量是一个函数一样
委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。
委托的声明指定了一个返回类型和一个参数列表
定义了委托之后就可以声明该委托类型的变量。接着把这个变量初始化为与委托具有相同返回类型和参数列表的函数引用。
之后就可以使用委托变量调用这个函数,就像该变量是一个函数一样
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Delegate
{
class Program
{
delegate double ProcessDelegate(double param1,double param2);//委托的定义
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;//声明委托类型的变量
Console.WriteLine("Enter 2 number 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 (input == "M")
process = new ProcessDelegate(Multiply);
//或者 process=Multiply;
else
process = new ProcessDelegate(Divide);
//或者 process=Divide;
Console.WriteLine("Result:{0}", process(param1, param2));
Console.ReadKey();
}
}
}
这里,把委托变量看成一个函数名,但与函数不同,我们还可以对这个变量执行更多的操作,例如通过参数将其传递给一个函数:
static void ExecuteFunction(ProcessDelegate process)
{
process(4.7,2.1);
}
运行效果: