一、委托的定义
1、官方定义
委托是一种定义方法签名的类型。当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。您可以通过委托实例调用方法。
2、个人理解
委托就是执行方法(函数)的一个类。事件是一种特殊的委托
二、如何申明委托及各种申明的区别
1、使用delegate关键字申明委托,如下:
public delegate int CalcDelegate(int x, int y);
2、Action、Action表示无返回值得泛型委托
Action:表示无参数、无返回值得委托
Action<int,string>:表示有传入参数int,string,无返回值得委托。
例如下:
public void Calc<T>(Action<T> action,T p)
{
action(p);
}
3、Func、Func表示有返回值得泛型委托
Func<int>:表示无参,返回值为int的委托。
Func<object,string,int>:表示传入参数为object,string。返回值是int的委托。
例如下:
public int Calc<T1,T2>(Func<T1,T2,int> func,T1 a,T2 b)
{
return func(a, b);
}
4、predicate、predicate是返回bool型的泛型委托。
predicate<int>:表示传入参数为int,返回bool的委托。
Predicate有且只有一个参数,返回值固定为bool
例:public delegate bool Predicate<T> (T obj)
5、四种委托之间的区别
delegate至少0个参数,至多32个参数,返回类型可有可无。
Action 至少1个参数,至多16个参数,无返回值。
Func 至少0个参数,至多16个参数,依据返回值泛型返回,必须有返回值,
Predicate 一个参数,返回值固定为bool类型。
三、如何使用委托(委托的用途)
1、函数声明
public delegate int CalcDelegate(int x, int y);
private static int Add(int x, int y)
{
return x + y;
}
CalcDelegate calc = new CalcDelegate(Add);
Console.Write(calc(1, 2));
Console.WriteLine();
2、匿名方法
public delegate int CalcDelegate(int x, int y);
CalcDelegate calc = delegate(int x, int y)
{
return x + y;
};
Console.Write(calc(1, 2));
Console.WriteLine();
3、Labmda表达式
CalcDelegate calc = (int x, int y) => { return x + y; };
Console.Write(calc(1, 2));
Console.WriteLine();
四、各种委托的使用