1、为什么要使用委托
将一个方法作为参数传递给另一个方法
2、委托概念
声明:
public delegate int DelegateName(int a, int b);
声明一个委托类型,可以用访问修饰符修饰,delegate关键字,有返回值和参数
委托所指向的函数必须跟委托具有相同的签名,即相同的参数个数,相同的参数类型和相同的返回值类型
创建委托实例写法:
委托 委托名=new 委托(会调用的方法名)
或者:
委托 委托名 =会调用的方法名
3、泛型委托
声明:
public delegate T 委托名<T>(T a, T b);
我们每次要使用一个委托时,都需要先声明这个委托类,规定参数和返回值类型,然后才能实例化、调用。为了简化这个过程, .NET 框架为我们封装了三个泛型委托类,它们分别是Action,Func和Predicate。因此大部分情况下我们不必再声明委托,可以拿来直接实例化使用,方便了我们的日常Coding。
1). Action
public delegate void Action<T>(T obj1,Tobj2,...);
Action是无返回值的泛型委托
Action表示无参,无返回值的委托
Action<int,string> 表示有传入参数int,string无返回值的委托
Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托
Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托
Action至少0个参数,至多16个参数,无返回值。
创建委托实例写法:
Action<参数1, 参数2> 委托名= ((参数1,参数2) => {无返回值的方法体 });
2). Func
public delegate<T> Func<T>(T obj1,Tobj2,...);
Func是有返回值的泛型委托
Func<int> 表示无参,返回值为int的委托
Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
Func<T1,T2,T3,int> 表示传入参数为T1,T2,T3(泛型)返回值为int的委托
Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void
创建委托实例写法:
Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });
3). Predicate
public delegate bool Predicate<T>(T obj);
这个委托只能传入一个参数,并且如参的类型由使用者自行提供,返回一个bool类型的值。
Predicate 是返回bool型的泛型委托
Predicate<int> 表示传入参数为int 返回bool的委托
Predicate有且只有一个参数,返回值固定为bool
创建委托实例写法:
Predicate<参数1> 委托名= ((参数1) => {带返回值的方法体 });
4、匿名函数(没有函数名,直接方法体)
本来呢委托定义(声明)好之后,还得再单独定义委托需要使用的方法。不如说你定义了一个计算器的委托, 你还需要重新写计算加减乘除的方法了来供计算器委托来使用。这时候我们就想到了匿名方法。用匿名方法就不需要再单独写加减乘除这些方法了,只需要在匿名方法的方法体内实现这些逻辑就好了。
例子如下:
delegate int calculator(int x, int y); //委托类型
static void Main(string[] args)
{
//创建委托对象(确定与哪些方法进行绑定),委托实例名=new 委托名(某个类的方法)本例与加法向绑定
calculator Adding =delegate( int x, int y)
{
return x+y;
};
calculator Moveing = delegate(int x, int y)
{
return x - y;
};
calculator Multiply = delegate(int x, int y)
{
return x * y;
};
calculator Divide = delegate(int x, int y)
{
return x / y;
};
Adding(4, 4);//8
Moveing(4, 4);//0
Multiply(4, 4);//16
Divide(4, 4);//1
}
创建委托实例写法:
委托 委托名=delegate(参数){会调用的方法体};
5、 Lambda表达式
定义:"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式
好处:Lambda简化了匿名委托的使用,减少开发中需要编写的代码量。
具体内容:它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。
写法:所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to"。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。Lambda表达式x => x * x读作"x goes to x times x"。
创建委托实例写法:
委托 委托名=(参数1,。。参数n)=>{会调用的方法体};
六、调用委托实例通用写法:
1.委托实例.Invoke(参数列表)
2.委托实例(参数列表)
3.this.Invoke(委托实例, new object[] { 参数列表});