Lambda 表达式的简介及形成过程
C#的Lambda表达式是一种"语法糖",使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:
形参列表=>函数体
函数体多于一条语句的可用大括号括起。
要了解Lambda表达式,首先就要了解什么是委托,委托(delegate)是一种引用类型.简单讲,委托就是一个函数指针.先看一个例子
//声明一个委托
public delegate int DelegateAdd(int a, int b);
public class A
{
//静态的处理方法
public static int Add(int a, int b)
{
return a + b + 3;;
}
}
//入口类
public class B
{
public static void Main()
{
//实例一个委托
DelegateAdd mdh = new DelegateAdd(A.Add);
//调用委托
int sum = mdh(2, 2);
Console.WriteLine(sum.ToString());
}
}
上面是一个非常简单的例子,具体的实现步骤:
1、 先声明个委托实例 ;
2、然后提供要处理的方法;
3、再实例化委托(把委托看作是类的话,实例化委托就不难理解了,其参数是要处理的方法,这里的方法 不用加括号,实例化的过程就是装载方法的过程,就好像需要参数的构造函数一样)实例化后的委托对象就好比是c++中的指针,它本身就是封装了方法的对象;
4、最后我们调用委托对象就好比是调用了被封装方法本身,调用时的参数也就传给了被封装的方法。
5、需要注意的是 所声明的委托无论是 参数个数,参数类型,返回值类型 都要和所要封装的方法保持一致,当调用委托实例对象时,所传入的参数也要保持一致 ,否则会出现错误。
以上实例是定义了一个A.Add()的方法.但是还有一种方法,就是先不定义,在实例化委托的时候,直接定义一个匿名方法.则以上实例变成了以下代码
public delegate int DelegateAdd(int a, int b);
//入口类
public class B
{
public static void Main()
{
//实例一个委托的同时,定义了一个匿名方法
DelegateAdd mdh = new DelegateAdd(delegate(int a,int b){return a+b+3;});
//调用委托
int sum = mdh(2, 2);
Console.WriteLine(sum.ToString());
}
}
以上方法就是做了一步的改进,使用了匿名方法,就不用在外部在定义方法了.
进一步的优化以下语句:
DelegateAdd mdh = new DelegateAdd(delegate(int a,int b){return a+b+3;});
1) 省略了 new DelegateAdd
DelegateAdd mdh = delegate(int a,int b){return a+b+3;};
2) 省略了关键字 delegate,并加上符号 =>
DelegateAdd mdh = (int a,int b)=>{return a+b+3;};
3) 省略参数类型
DelegateAdd mdh = (a,b)=>{return a+b+3;};
4) 省略可以省略的括号,return 等,最终形成Lambda表达式
DelegateAdd mdh = (a,b)=>a+b+3;
再举个系统常用的委托:Func<T,TResult>. 如下:
1)new Func<string,int>(delegate(string str){return str.length;})
2)delegate(string str){return str.length;}
3)(string str)=>{return str.length;}
4)(string str)=>str.length;
5)(str)=>str.length;
6)str=>str.length;