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. user-agent | what is the "user-agent" ?

    User Agent(用户代理) UA是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等 通过抓包可以得到 下面是几个 ...

  2. 传入两坐标点,利用div+css画线

    上样式生成函数代码 lineStyle (x1, y1, x2, y2, lineWidth = 4, color = 'black') { let rectX = x1 < x2 ? x1 : ...

  3. linux系统资源监控

    top命令 1.平均负载(load average): 正在耗费CPU进程与正在等待io的进程之和,三个值分别是一分钟,五分钟,十五分钟的平均负载,负载值只要小于CPU颗粒数属于正常情况 任务进程(T ...

  4. MariaDB dos 下连接

    本地 DOS 连接 将文件目录切换到 bin 文件夹下 cd C:\xampp\mysql\bin 输入连接命令 输入 status,查看数据库版本 远程DOS 连接

  5. git教程——安装配置

    Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个 ...

  6. mysql中Table is read only的解决方法

    首先去到mysq的bin目录 cd /usr/local/mysql/bin 执行如下mysqladmin ./mysqladmin -p flush-tables 接着输入数据库存的root密码即可

  7. java中List<Map<String, Object>>关于null的判断

    List<Map<String, Object>> selectTmFileInfo = fileInfoService.selectTmFileInfoByToken(cTo ...

  8. Linux常用服务器搭建

    1.Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于Internet上的控制文件 ...

  9. 字符串匹配(二)----KMP算法

    什么是KMP算法: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法).KMP ...

  10. NIO类库

    NIO概述 从JDK1.4开始,引入了新的I/O类库,它们位于java.nio包中,其目的在于提高I/O的操作效率.nio是new io的缩写. 参考文章:NIO BIO AIO区别 java.nio ...