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 ...
随机推荐
- Redis学习记录之Java中的初步使用
1.关于Redis redis下载地址:<span style="font-family: Arial, Helvetica, sans-serif;">http:// ...
- Hibernate学习之对象持久化
1. 对象持久化 对象的持久化就是把内存中对象形式的业务数据,转换成数据库中的关系数据形式的业务数据.广义理解,对象的持久化还包括内存与关系数据库之交换业务数据的各种操作. 2. 对象持久化模式 1 ...
- android 49 广播接收者中启动其他组件
main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" andro ...
- linux调度器系列
http://blog.csdn.net/wudongxu/article/category/791519
- myEclipse新建jsp,默认编码
修改地方在: myeclipse →fiter and editor →jsp
- FastDFS安装配置手册
文件服务器分布式系统安装手册 本文档详细的介绍了FastDFS的最小集群安装过程.集群环境如下: tracker:20.2.64.133 .用于调度工作,在访问上起负载均衡的作用. group1: s ...
- 如何自定义UIPickerView中文本的大小和文本靠左或靠右显示?
需要重写UIPickerView中的 -(UIView*)pickerView:(UIPickerView*)pickerView viewForRow:(NSInteger)row forCompo ...
- 第七章----pwm蜂鸣器
Linux代码的重用: 在头文件中加载即可使用到原来所有的功能,还有动态方式就是一个驱动使用另一个驱动的资源. 对于像蜂鸣器这样的实验,它的内部文件有很多,所有要有很多的源代码以用于妥善管理. 有多个 ...
- hdu 3450 Counting Sequences
/* n*n暴力 这个很好想 */ #include<cstdio> #define maxn 100010 #define mod 9901 using namespace std; i ...
- OSI 网络七层模型(笔记)
一直以来我们都在使用着互联网,每天聊着qq,上着淘宝,但是却不了解怎么运行的呢,充满了好奇.今天同过了解来总结一下OSI网络七层模型: 上一张图 OSI (open system interconne ...