Lambda表达式可分为表达式lambda和语句lambda

表达式lambda:表达式位于 => 运算符右侧的lambda表达式称为表达式lambda

(input parameters) => expression     //表达式lambda

例如

(x, y) => x == y

语句lambda:=> 运算符右侧是一个语句块,语句包含在大括号中

(input parameters) => {statement;}  //语句lambda

例如:

(x, y) => {return x == y;}

这两者除了写法不一样,还有什么区别吗,用以下代码作为测试

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的数,然后输出来,结果如下

输出结果一样。

查看反编译后的代码

看来编译器做了处理,两者的代码都是一样了,既然这样,那么在语句lambda中多加一行代码,Console.WriteLine(p); 这样就不会生成一样的代码了

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,最后都生成一个方法,这里生成的方法分别是,然后将方法赋给委托变量,就是这部分:

所以,给委托变量赋值时,表达式lambda和语句lambda写法不一样,但是最后编译器都生成一个方法。

还有个不同点,表达式lambda可以转换为类型Expression<T>的表达式树,而语句lambda不可以

Expression<Func<int, int, int>> expression = (a, b) => a + b;//正确
Expression<Func<int, int, int>> expression1 = (a, b) => { return a + b; };//错误,无法将具有语句体的 lambda 表达式转换为表达式树

(转) Lambda表达式中的表达式lambda和语句lambda区别的更多相关文章

  1. Lambda表达式中的表达式lambda和语句lambda区别

    Lambda表达式可分为表达式lambda和语句lambda 表达式lambda:表达式位于 => 运算符右侧的lambda表达式称为表达式lambda (input parameters) = ...

  2. Mysql中truncate table和delete语句的区别

    Mysql中的truncate table和delete语句都可以删除表里面所有数据,但是在一些情况下有些不同! 例子: truncate table gag; (1)truncate table删除 ...

  3. Lambda的分类(语句Lambda和表达式Lambda)

    学习自 <C#本质论> Overview 在上一文中,我们简而又简的了解了一下,匿名方法和Lambda表达式,关于匿名方法这里暂且不表,本文我们来更加详细的了解一下Lambda表达式. 本 ...

  4. JSP中EL表达式的比较符号、字符串比较

    在EL表达式中我们可以使用运算符以达到我们想要的结果,运算符按作用分为以下几种: 1.算术运算符 +  例如:${6+6} .注意:在EL表达式中的‘+’只有数学运算的功能,没有连接符的功能,它会试着 ...

  5. 关于Linq中的Lambda表达式中OrderBy的深入理解

    起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ...

  6. 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  7. Lambda 表达式中的变量范围

    delegate bool D(); delegate bool D2(int i); class Test { D del; D2 del2; public void TestMethod(int ...

  8. java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)

    2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...

  9. java 8 lambda表达式中的异常处理

    目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,lam ...

随机推荐

  1. CentOS安装wordpress权限问题

    最近在CentOS6.5上安装wordpress,遇上一个问题,安装好之后外网总是不能再网页进行配置,想了半天应该是源代码文件的权限问题,具体问题与解决如下: 如果你的wordpress安装目录是wo ...

  2. android自定义控件(9)-Android触摸事件分发机制

    触摸事件的传递机制:   首先是最外层的viewgroup接收到事件,然后调用会调用自己的dispatchTouchEvent方法.如果在ACTION_DOWN的时候dispatchTouchEven ...

  3. LINUX命令总结 -------来自 水滴娃娃 的CSDN

    LINUX命令总结 标签: LINUX命令总结 2014-01-27 15:54 41039人阅读 评论(1) 收藏 举报  分类: linux(1)  版权声明:本文为博主原创文章,未经博主允许不得 ...

  4. mysql 定义function rand

    MySQL获取随机数   如何通过MySQL在某个数据区间获取随机数? MySQL本身提供一个叫rand的函数,返回的v范围为0 <= v < 1.0. 介绍此函数的MySQL文档也介绍道 ...

  5. TMS320C64X+ 中使用EDMA3中断

    关于EDMA3,TI的文档有详细的介绍.园子里的文章 http://www.cnblogs.com/fpga/archive/2009/10/13/1582516.html,http://www.cn ...

  6. 从头开始写框架(一):浅谈JS模块化发展

    博客申请下来已经过去一个月了,一直不知道写点什么,毕竟我的文笔不是很好orz. 不过既然申请下来了,不写点什么总是觉得很可惜.正好最近在自己写框架,就把自己的进程和一些心得体会分享出来吧. 写在前面: ...

  7. getStyle(),修改样式属性

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 2015年11月30日 spring初级知识讲解(一)装配Bean

    序,Spring的依赖注入是学习spring的基础.IOC为控制反转,意思是需要的时候就由spring生成一个,而不是先生成再使用. 写在前面 Spring提供面向接口编程,面向接口编程与依赖注入协作 ...

  9. JS keycode 事件响应

    <script language="javascript"> function keyevent(){ if(event.keyCode==13) alert(&quo ...

  10. plt和got

    最近在学习linux高级调试技术.下面就动态库连接这块做了一个实验 首先理解下plt是procedure linkage table,got是global offset table.got表中存放的是 ...