1.委托的概念
委托(delegate)是一种存储函数引用的数据类型。委托是用返回类型和参数列表定义的变量。 给定的委托类型可以匹配返回类型和参数与委托定义相同的函数。委托可以近似理解为函数指针,即可以实现把方法当作参数进行传递。
1.1 委托的定义
委托的定义和函数类似,但是不带函数体,并且必须使用delegate关键字。如下所示,定义了一个委托,需要两个double类型的参数,返回类型也是double:
delegate double ProcessDelegate(double param1, double param2);
1.2 委托的实例化
定义了委托之后,就可以声明该委托类型的变量:
ProcessDelegate process;
将委托变量初始化为与该委托具有相同返回类型和参数列表的函数引用之后,就可以使用委托变量调用这个函数,就像变量是一个函数一样。
static double Add(double a, double b)
{
return a + b;
}
process = new ProcessDelegate(Add);
委托还可以通过匿名方法来进行实例化,例如:
ProcessDelegate process = delegate(double a, double b)
{
return a + b;
};
有了引用函数的变量后,就可以执行不能用其他方式完成的操作。例如,可以把委托变量作为一个参数传递给一个函数,使得该函数可以使用委托调用它引用的任何函数,而且在运行之前不必知道调用的是哪一个函数。
1.3 委托使用示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1.Delegate
{
class Program
{
delegate double ProcessDelegate(double param1, double param2);
static double Add(double a, double b)
{
return a + b;
}
static double Subtract(double a, double b)
{
return a - b;
}
static void Main(string[] args)
{
ProcessDelegate process;
Console.WriteLine("Please 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 A to add or B to subtract:");
input = Console.ReadLine();
if(input == "A")
{
process = new ProcessDelegate(Add);
}
else
{
process = new ProcessDelegate(Subtract);
}
Console.WriteLine("Result:{0}", process(param1, param2));
Console.ReadKey();
}
}
}
2.泛型委托
要定义泛型委托,只需声明和使用一个或多个泛型类型参数,例如:
delegate T1 MyDelegate<T1, T2>(T1 a, T2 b)
欢迎关注我的公众号。