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. Pandas 0 数据结构Series

    # -*- encoding:utf-8 -*- # Copyright (c) 2015 Shiye Inc. # All rights reserved. # # Author: ldq < ...

  2. 常见的UI框架

    移动端框架 1.Admui 管理系统快速开发框架--http://docs.admui.com/ 为什么选择Admui?代码开源--开放所有源码,不存在任何加密混淆代码,安全全程可控,开箱即用--包含 ...

  3. css实用属性

    background-size: 100% 100%;            背景通过拉伸实现填充 自适应 overflow: hidden;                              ...

  4. vue三级联动

    <select @change="getArea(province_id,1)" v-model="province_id"> <option ...

  5. SpringSecurity实现权限管理和页面导航栏动态实现

    用户模块. 3 1.1  需求:获取用户名. 3 1.1.1     分析. 3 1.1.2     服务端获取用户信息. 4 1.1.3     页面获取用户信息. 5 1.2  给用户分配角色. ...

  6. mysql的必知技巧

    1.使用联合索引可以大大减少查询数据,联合索引的顺序尽量为查询的顺序

  7. EDI

    EDI, Electronic Data Interchange,电子数据交换 EDI 商务是指将商业或行政事务按一个公认的标准,形成结构化的事务处理或文档数据格式,从计算机到计算机的电子传输方法.简 ...

  8. 一个帮助理解python星号的例子

  9. 电子科技大学实验中学PK赛(一)比赛题解

    比赛来源:第十四届重庆大学程序设计大赛暨西南地区高校邀请赛现场初赛 比赛地址:http://qscoj.cn/contest/24/ A. Comb 自述 分析:统计ACM在题目描述中出现的次数,认真 ...

  10. 【RL-TCPnet网络教程】第14章 RL-TCPnet之TCP客户端

    第14章      RL-TCPnet之TCP客户端 本章节为大家讲解RL-TCPnet的TCP客户端实现,学习本章节前,务必要优先学习第12章TCP传输控制协议基础知识.有了这些基础知识之后,再搞本 ...