c# 委托 delegate
C#中的lambda表达式
C#中的Func委托
委托
- 委托类似于一个方法,前面加上delegate,有名字、有参数(),但没有方法体{}。
- 它就是一个百变软泥怪,可以被赋予任何一个方法(结构要一致的),然后他就变成这个方法了。
- 他有点类似于abstract的抽象类的感觉,自己不实现方法,通过实例化来实现具体不同方法。
匿名函数
- 匿名委托是为了简化委托,简化了“初始化委托变量,将方法与委托关联起来”这个过程。
lambda
- lambda表达式是为了简化匿名委托。
- 匿名委托和lambda表达式本身都是一个方法来的,但他们都没有名字,所以没法直接调用,要用就只能调用其委托。
- lambda表达式可以说是一种方法的变体,方法的简写缩写方式,将方法的参数()和方法体{}单独拿出来。感觉是一次性的用法,别的地方不再调用了,只用在这一个地方,所以直接在用的地方写出来,名字也没有,也不打算别的地方调用。
Action<>,Func<>,Predicate<>
- Action是无返回值的泛型委托
- Func是有返回值的泛型委托
- Predicate<>是返回bool类型的委托
- 他们都有多个参数的重载版本
- 如果说lambda是为了简化委托的后半部分方法体的初始化,那么Func他们就是为了简化委托的定义部分(前半部分)。
public delegate int DelegateProcess(int num1, int num2);
//第一种写法
DelegateProcess process= new DelegateProcess(Multiply);
//第二种写法
DelegateProcess process= Multiply;
//第三种写法 匿名委托
DelegateProcess process= delegate(int a,int b)
{
return a*b;
}
//第四种写法 Lamdba表达式
DelegateProcess process =((int a,int b)=>{return a*b;});
//第五种写法 Action<T>和Func<T>
Action<int,int> process= ((int a,int b)=>{Console.WriteLine(a * b);});
Func<int,int,int> process= ((int a,int b)=>{return a*b;});
- 委托的正常流程,第一步,先定义一个委托;第二步,定义一个方法;第三步,将方法赋予给委托。
- 用Func和lambda可以将上面三步变成一步,直接Func定义委托,然后=号,然后lambda表达式。