定义
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
如果我们要把一个方法当作另一个方法的参数来传递,那么我们就需要用到委托。
可将任何可访问类或结构中与委托类型匹配的任何方法分配给委托。 该方法可以是静态方法,也可以是实例方法。 这样便能通过编程方式来更改方法调用,还可以向现有类中插入新代码。
- 语法:
写在命名空间中或类中。
//定义一个委托,可赋值 返回值为空并且参数列表也为空的方法。
public delegate void PerformFunction1();
//定义一个委托, 可赋值 返回值为int,不需要参数的方法。
public delegate int PerformFunction2();
//定义一个委托, 可赋值 返回值为空,参数列表第一个为int,第二个为string,第三个为float的方法
public delegate void PerformFunction3(int age, string name, float height);
//定义一个委托, 可指向 返回值为bool, 参数列表为 任意两个同类型的形参
public delegate bool Compare<in T>(T obj1, T obj2);
static void Main(string[] args)
{
// 两种初始化方法
PerformFunction1 perform1 = new PerformFunction1(testFunction);
PerformFunction3 perform2 = printPersonDesc;
// 两种调用方法
perform1();
perform2.Invoke(18, "张三", 1.87f);
}
static void printPersonDesc(int age, string name, float height)
{
Console.WriteLine(age + name + height);
}
static void testFunction()
{
Console.WriteLine("调用了testFunction");
}
将方法作为参数进行引用的能力使委托成为定义回调方法的理想选择。 例如,对比较两个对象的方法的引用可以作为参数传递到排序算法中。
示例
// 声明委托——定义所需的签名:
delegate double MathAction(double num);
class DelegateTest
{
//常规方法相匹配的签名:
static double Double(double input)
{
return input * 2;
}
static void Main()
{
//实例化委托与命名方法:
MathAction ma = Double;
//调用委托ma:
double multByTwo = ma(4.5);
Console.WriteLine("multByTwo: {0}", multByTwo);
// 实例化委托与匿名方法:
MathAction ma2 = delegate(double input)
{
return input * input;
};
double square = ma2(5);
Console.WriteLine("square: {0}", square);
// 实例化委托与lambda表达式
MathAction ma3 = s => s * s * s;
double cube = ma3(4.375);
Console.WriteLine("cube: {0}", cube);
}
// Output:
// multByTwo: 9
// square: 25
// cube: 83.740234375
}