Lamdba表达式与表达式树

Lamdba表达式

C#2.0中的匿名方法使得创建委托变得简单起来,甚至想不到还有什么方式可以更加的简化,而C#3.0中的lamdba则给了我们答案。

lamdba的行为实际上和匿名方法是一致的,可以简单粗暴的理解为是匿名方法的进化版本,和匿名方法作用一致,但书写起来更加简单,lamdba表达式有特别的转换規則,表达式并不是委托类型(Delegate),而它可以隐式或显式的转换成委托实例。

还记得.Net framework给我们内置了两种委托 Func与 Action下面使用它们来进行lamdba的编写

第一个版本,首先定义了一个Func<string,string>类型的委托变量,然后使用lamdba表达式进行实例化委托变量。

(x) => { To-do…}

小括号里是参数,这里只有一个string类型的参数所以写一个 x也就是我们string类型的参数,但是在这里我们并不需要指定类型。 然后是=> 最后是 大括号,里面是方法主体。

第二个版本

在这个版本可就厉害了,可以看到小括号被忽略了,大括号也被忽略了,甚至return 也不存在了,当然这是需要特殊情况下才可以这么去写的,如果参数是两个,那么就要乖乖的把小括号写上了,而后面的主体如果具有逻辑运算,也要把大括号加上。不过现在已经可以看到lamdba表达式是多么惊人了

在一切可以使用匿名方法和委托的地方都可以换成简洁的lamdba表达式

表达式树

表达式树是把代码做为数据,它是一种数据类型,数据就是代码,这可能听起来很绕。

使用表达式树可以将代码表示成一个对象树,在Linq中大量的被应用。树形结构都知道是什么,表达树式的每一个节点都是一个表达式,在C#中我们使用Experssion类进行创建表达式树。下面创建一个简单的表达式树

首先创建第一个节点,然后创建第二个节点。用add类型的表达式将他们组合起来。再打印到屏幕上,会打印4吗?并不会,表达式树只是一种数据结构,并不是可被执行的代码。所以打印出来的是当前的结构

表达式树可以编译成委托,使用LamdbaExperssion,使用它可以把数据结构编译成可执行的代码。

除了用上面的方式去创建一个代表式,还可以直接使用lamdba表达式去创建表达式树,会更加的简单,不过这是有限制的,一个带有語句块的lamdba是不可以转换成表达式树的

事实上lamdba和表达式树是天生一对,他们共同为linq服务,少了谁对方的存在都失去了色彩。

C#3.0 Lamdba表达式与表达式树的更多相关文章

  1. C#3.0新增功能10 表达式树 02 说明

    连载目录    [已更新最新开发文章,点击查看详细] 表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构.表达式树和 Roslyn API 中用于生成分析器和 Cod ...

  2. C#3.0新增功能10 表达式树 04 执行表达式

    连载目录    [已更新最新开发文章,点击查看详细] 表达式树 是表示一些代码的数据结构. 它不是已编译且可执行的代码. 如果想要执行由表达式树表示的 .NET 代码,则必须将其转换为可执行的 IL ...

  3. [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用

    [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是 ...

  4. C#中的Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  5. Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  6. C# 语言规范_版本5.0 (第7章 表达式)

    1. 表达式 表达式是一个运算符和操作数的序列.本章定义语法.操作数和运算符的计算顺序以及表达式的含义. 1.1 表达式的分类 一个表达式可归类为下列类别之一: 值.每个值都有关联的类型. 变量.每个 ...

  7. 深入学习C#匿名函数、委托、Lambda表达式、表达式树类型——Expression tree types

    匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...

  8. C#6.0语言规范(七) 表达式

    表达式是运算符和操作数的序列.本章定义了操作数和运算符的语法,求值顺序以及表达式的含义. 表达式分类 表达式分类为以下之一: 一个值.每个值都有一个关联的类型. 一个变量.每个变量都有一个关联的类型, ...

  9. [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门

    [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...

随机推荐

  1. Csharp 连接NHibernate下需要注意的几个点

    背景: 在学习Photon Server 时,我看的教程中使用了NHibernate 框架来连接管理Mysql数据库. 我在以前只使用过java中的Spring boot,感觉两者有些相似之处. 我写 ...

  2. [Git]2018-10 解决git cmd中文乱码问题

    2018年10月12日 莫名其妙出现cmd下git log中文乱码问题,显示一堆<E4><A8>之类的乱码.git bash却一切正常. 怀疑是Windows系统升级出现的不兼 ...

  3. 用OleDb导入Excel时提示驱动错误问题解决办法

    导入格式为xls的excel文件,发生了错误 未处理System.Data.OleDb.OleDbException HResult=-2147467259 Message=外部数据库驱动程序 (1) ...

  4. 使用mongo获取文章

    先在命令行中输入mongo,进入mongo,然后 show dbs # 从结果中发现有cmb_demo_23_hacker use cmb_demo_23_hacker db.all_in_one.f ...

  5. node简介

    1. Node.js是什么? 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js ...

  6. vue 图片预览插件

    https://github.com/daidaitu1314/vue2-preview //cnpm cnpm install vue2-preview -save //引入 import VueP ...

  7. C#线程 ---- 线程同步详解

    线程同步 说明:接上一篇,注意分享线程同步的必要性和线程同步的方法. 测试代码下载:https://github.com/EkeSu/C-Thread-synchronization-C-.git 一 ...

  8. C++初步 2

    对象数组: Coordinate coord[3];  栈区           Coordinate *p=new Coordinate[3];    堆区 /* * Coordinate.h * ...

  9. vue中计算属性computed方法内传参

    vue中computed计算属性无法直接进行传参 如果有传参数的需求比如说做数据筛选功能可以使用闭包函数(也叫匿名函数)实现 例如: 在上篇博客vue安装使用最后的成绩表练习中的过滤功能的实现: &l ...

  10. 20175324 2018-2019-2 《Java程序设计》第5周学习总结

    20175324 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 抽象类和具体类的区别在于抽象类中有抽象方法而具体类中没有.且抽象类不能实例化. 接口:如果一 ...