Lambda表达式可分为表达式lambda和语句lambdaexpress
表达式lambda:表达式位于 => 运算符右侧的lambda表达式称为表达式lambda测试
(input parameters) => expression //表达式lambda
例如spa
(x, y) => x == y
语句lambda:=> 运算符右侧是一个语句块,语句包含在大括号中3d
(input parameters) => {statement;} //语句lambda
例如:code
(x, y) => {return x == y;}
这二者除了写法不同,还有什么区别吗,用如下代码做为测试blog
using System; using System.Collections.Generic; namespace LinqTest { class Program { static void Main(string[] args) { List<int> list = new List<int> { 1, 3, 2, 4 }; var resultUsingExpressionLambda = list.FindAll(p => p < 3); Console.WriteLine("使用表达式lambda:"); foreach (var item in resultUsingExpressionLambda) { Console.WriteLine(item); } var resultUsingStatementLambda = list.FindAll(p => { return p < 3; }); Console.WriteLine("使用语句lambda:"); foreach (var item in resultUsingStatementLambda) { Console.WriteLine(item); } } } }
代码比较简单,就是分别使用表达式lambda和语句lambda找出小于3的数,而后输出来,结果以下get
输出结果同样。input
查看反编译后的代码编译器
看来编译器作了处理,二者的代码都是同样了,既然这样,那么在语句lambda中多加一行代码,Console.WriteLine(p); 这样就不会生成同样的代码了string
Console.WriteLine(p.ToString());
using System; using System.Collections.Generic; namespace LinqTest { class Program { static void Main(string[] args) { List<int> list = new List<int> { 1, 3, 2, 4 }; var resultUsingExpressionLambda = list.FindAll(p => p < 3); Console.WriteLine("使用表达式lambda:"); foreach (var item in resultUsingExpressionLambda) { Console.WriteLine(item); } var resultUsingStatementLambda = list.FindAll(p => { Console.WriteLine(p);//这是新加的 return p < 3; }); Console.WriteLine("使用语句lambda:"); foreach (var item in resultUsingStatementLambda) { Console.WriteLine(item); } } } }
再查看反编译后的代码
再来看下IL代码
能够看到,不管是表达式lambda仍是语句lambda,最后都生成一个方法,这里生成的方法分别是和
,而后将方法赋给委托变量,就是这部分:
Expression<Func<int, int, int>> expression = (a, b) => a + b;//正确 Expression<Func<int, int, int>> expression1 = (a, b) => { return a + b; };//错误,没法将具备语句体的 lambda 表达式转换为表达式树
//可是他们均可以赋给一个Func
Func<int, int, int> fun = (a, b) => a + b;//正确 Func<int, int, int> fun1 = (a, b) => { return a + b; };//正确