Lambda表达式中的表达式lambda和语句lambda区别
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区别的更多相关文章
- (转) Lambda表达式中的表达式lambda和语句lambda区别
Lambda表达式可分为表达式lambda和语句lambda 表达式lambda:表达式位于 => 运算符右侧的lambda表达式称为表达式lambda (input parameters) = ...
- Mysql中truncate table和delete语句的区别
Mysql中的truncate table和delete语句都可以删除表里面所有数据,但是在一些情况下有些不同! 例子: truncate table gag; (1)truncate table删除 ...
- Lambda的分类(语句Lambda和表达式Lambda)
学习自 <C#本质论> Overview 在上一文中,我们简而又简的了解了一下,匿名方法和Lambda表达式,关于匿名方法这里暂且不表,本文我们来更加详细的了解一下Lambda表达式. 本 ...
- JSP中EL表达式的比较符号、字符串比较
在EL表达式中我们可以使用运算符以达到我们想要的结果,运算符按作用分为以下几种: 1.算术运算符 + 例如:${6+6} .注意:在EL表达式中的‘+’只有数学运算的功能,没有连接符的功能,它会试着 ...
- 关于Linq中的Lambda表达式中OrderBy的深入理解
起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ...
- 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- Lambda 表达式中的变量范围
delegate bool D(); delegate bool D2(int i); class Test { D del; D2 del2; public void TestMethod(int ...
- java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)
2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...
- java 8 lambda表达式中的异常处理
目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,lam ...
随机推荐
- SDUT2608(Alice and Bob)
题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynom ...
- [RxJS] Error handling operator: catch
Most of the common RxJS operators are about transformation, combination or filtering, but this lesso ...
- IOS—通过ChildViewController实现view的切换
IOS-通过ChildViewController实现view的切换 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候被盖在最后,我们在最外层Vi ...
- 一次优化web项目的经历记录(一)
一次优化web项目的经历记录 这段时间以来的总结与反思 前言:最近很长一段时间没有更新博客了,忙于一堆子项目的开发,严重拖慢了学习与思考的进程.开水倒满了需要提早放下杯子,晚了就会烫手,这段时间以来, ...
- 第七章----pwm蜂鸣器
Linux代码的重用: 在头文件中加载即可使用到原来所有的功能,还有动态方式就是一个驱动使用另一个驱动的资源. 对于像蜂鸣器这样的实验,它的内部文件有很多,所有要有很多的源代码以用于妥善管理. 有多个 ...
- Python CMDB开发
Python CMDB开发 运维自动化路线: cmdb的开发需要包含三部分功能: 采集硬件数据 API 页面管理 执行流程:服务器的客户端采集硬件数据,然后将硬件信息发送到API,API负责将获取 ...
- R cannot be resolved to a variable
1. 检查Android 的SDK是否丢失需要重新下载,检查build path,把需要导入的JAR包确认都导入成功 2. 确保class没有import Android.R,注意是不能有Androi ...
- 45种Javascript技巧大全
JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...
- String的hashCode原理
参考下面这篇文章: http://blog.csdn.net/steveguoshao/article/details/12576849 http://blog.csdn.net/mingli1986 ...
- VS 创建 使用C++ 静态类库(Dll)
创建静态类库 Walkthrough: Creating and Using a Dynamic Link Library (C++) 1:菜单栏-->File, New, Project. 2 ...