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> { , , , };
var resultUsingExpressionLambda = list.FindAll(p => p < );
Console.WriteLine("使用表达式lambda:");
foreach (var item in resultUsingExpressionLambda)
{
Console.WriteLine(item);
}
var resultUsingStatementLambda = list.FindAll(p =>
{
return p < ;
});
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> { , , , };
var resultUsingExpressionLambda = list.FindAll(p => p < );
Console.WriteLine("使用表达式lambda:");
foreach (var item in resultUsingExpressionLambda)
{
Console.WriteLine(item);
}
var resultUsingStatementLambda = list.FindAll(p =>
{
Console.WriteLine(p);//这是新加的
return p < ;
});
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. 从奥鹏一个答案提取页面 看jquery知识点

     http://oldlearn.open.com.cn/OEMSExercise/HomeworkReview.aspx?HomeworkId=9c034488-0a3d-4b9d-a6cc-e42 ...

  2. ecshop获取浏览器各个版本

    <?php /** * 获得浏览器名称和版本 * * @access public * @return string */ function get_user_browser() { if (e ...

  3. SQL 存储过程 通过多个ID更新数据 分类: SQL Server 2014-12-08 16:08 299人阅读 评论(0) 收藏

    下面举个例子说明: 我想让一部分品牌的名称(即Brand_Name)后面加上1,Brand_ID是主键,sql语句很容易实现,但是存储过程如何写呢? 错误写法如下: //*************** ...

  4. Unity 读取、写入自定义路径文件,调用System.Windows.Forms

    调用System.Windows.Forms DLL 首先在Unity新建Plugins文件夹添加System.Windows.Forms.dll 然后代码中添加引用 using System; us ...

  5. docker-compose.yml 语法说明

    YAML 模板文件语法 默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建. 其 ...

  6. [PWA] Enable Push Notification in your web app

    1. Clone the project: git clone https://github.com/GoogleChrome/push-notifications.git 2. install th ...

  7. Android 图标上面添加提醒(二)使用开源UI类库 Viewbadger

    版权声明:本文为博主原创文章,未经博主允许不得转载. 上一篇讲到用canvas进行绘制得到对应最终的bitmap. 在实际应用中,我们除了给图标添加数字外,也有可能加一些红色方块之类的图标作为新功能的 ...

  8. 一、Bitmap的recycle问题

    尽管Android有自己的垃圾回收机制,对于是不是要我们自己调用recycle,还的看情况而定.假设仅仅是使用少量的几张图片,回收与否关系不大.但是若有大量bitmap须要垃圾回收处理,那必定垃圾回收 ...

  9. Java语言基础(二)

    Java语言基础(二) 一.变量续 (1).变量有明确的类型 (2).变量必须有声明,初始化以后才能使用 (3).变量有作用域,离开作用域后自动回收 变量作用域在块内有效 (4).在同一定义域中变量不 ...

  10. mailsend - Send mail via SMTP protocol from command line

    Introduction mailsend is a simple command line program to send mail via SMTP protocol. I used to sen ...