大家在开发中会经常看到也会经常使用lambda表达式。

园子里也有很多详解lambda表达式的文章,多是从横向来讲述。

但lambda表达式到底如何变成现在这个样子,表达式的形式到底代表什么含义,这些可能就不太明白了。

本文将从来源开始,纵向剖析,一直演化出我们常用的lambda表达式。

引子

为方便说明,先举个例子,列出Lambda表达式的一个典型形式:

x=>x+1

大家可以看到,Lambda表达式的语法由三部分组成,分别为:

1. Lambda运算符 => 读作goes to;

2. 左边参数部分 x ;

3. 右边的Lambda主体

可以看出,其实所谓的Lambda表达式(lambda expression)就是一个匿名函数,或者说是匿名函数的简单形式。而匿名函数的作用就是分配给委托类型的。

假设我们声明一个委托:

delegate int Mydel(int x);

lambada 表达式(匿名函数)用来填充委托变量:

Mydel del= x=>x+1;

我们就从这个例子说开去。

演化过程

刚刚说过,lambda表达式就是匿名方法的简写形式,说到lambda表达式就要说到匿名方法,而匿名方法就是初始化委托时内联声明的方法。

因此我们先从委托说起,一直推导出 lambda表达式Mydel del=x=>x+1; 的形式。

和类相似,委托是用户自定义的引用类型。

类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。

可以将委托类比为类,创建和使用的过程如下:

1.声明类型

2.声明类型的变量

3.填充变量

4.使用变量

对应着四步的完整例子:

delegate int Mydel(int x);

Mydel del;

del=new Mydel(xxx方法); //也可以直接用简化写法 del=xxx方法;

del(2);

以上第三步中初始化委托使用 xxx方法 。

如果方法专门用来初始化委托,只会被使用一次,这种情况下,除了创建委托的语法需要,没有必要创建独立的具名方法,这样就引出了匿名方法。

匿名方法是在初始化委托时内联声明的方法,非匿名方法的例子如下:

public static int Add1(int x)

{

return x+1 ;

}

delegate int MyDel(int x);

调用:

MyDel del=Add1;

del(2);

改造成用匿名方法的完整例子:

delegte int MyDel(int x);

调用:

MyDel del=delegate(int x) { return x+1;}

del(2);

从例子中提取出匿名方法的语法:

delegate(Parameters) { ImplementationCode }

几个注意点:

1. 返回值:不显示声明返回值,与委托相同

2. 参数

以下情况可以使用圆括号为空或省略圆括号来简化参数列表。

a. 不包括任何out 参数 b. 不使用任何参数

满足上面两个条件即可省略参数列表,例子:

delegate int SomeDel();

SomeDel sDel = delegate { return 1; };

3.params 参数

如果委托声明的参数列表包含了 params 参数(可变数目参数),匿名方法的参数列表将忽略params关键字

delegate void SomeDel(int x, params int[] y);

SomeDel sDel = delegate(int x, int[] y) { … }

匿名方法准备好了,我们稍加变化,就可以得出Lambda表达式

以 MyDel del=delegate(int x) { return x+1;} 为例。

转换步骤:

1.删除delegate关键字,在参数列表和匿名方法主体之间放 =>

MyDel del = (int x) => {return x+1; } ;

可以进一步简化

2. 去掉参数类型

MyDel del2 = (x) => {return x+1; } ;

说明:

编译器可以从委托声明中知道委托参数的类型,因此可以省略类型。

带有类型的参数列表称为显式类型。

省略类型的参数列表称为隐式类型。

3.去掉参数刮号

MyDel del3 = x => {return x+1; } ;

说明:

如果只有一个隐式类型参数,可以省略刮号。

4.去掉主体的大刮号及return

MyDel del4 = x=> x+1;

说明:

Lambda表达式允许表达式的主体是语句块或表达式。

如果语句块包含一个返回语句,可以将语句块替换成return 后面的表达式。

这样就得到我们文章开头的形式。

总结

C#2.0引入了匿名方法,C#3.0引入了lambda表达式,可以看到,lambda表达式简化了匿名函数的使用,让代码更加简洁。

理解了这篇文章,相信大家对lambda表达式就会有一个整体的把握,再学具体用法时思路会很清晰。

祝学习进步~

浅入浅出Lambda表达式的更多相关文章

  1. 浅入浅出EmguCv(三)EmguCv打开指定视频

    打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图 ...

  2. 浅入浅出EmguCv(一)OpenCv与EmguCv

    最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领 ...

  3. 浅入深出之Java集合框架(上)

    Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

  4. 浅入深出之Java集合框架(中)

    Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

  5. 浅入深出之Java集合框架(下)

    Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...

  6. 浅入深出Vue:环境搭建

    浅入深出Vue:环境搭建 工欲善其事必先利其器,该搭建我们的环境了. 安装NPM 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的NodeJS Windows安装程序 下载下来后,直 ...

  7. 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置

    浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...

  8. 浅入深出Vue:工具准备之WebStorm安装配置

    浅入深出Vue之工具准备(一):WebStorm安装配置 工欲善其事必先利其器,让我们先做好准备工作吧 导航篇 WebStorm安装配置 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版 ...

  9. 浅入深出Vue系列

    浅入深出Vue导航 导航帖,直接点击标题即可. 文中所有涉及到的资源链接均在最下方列举出来了. 前言 基础篇 浅入深出Vue:工具准备之WebStorm搭建及配置 浅入深出Vue之工具准备(二):Po ...

  10. 浅入深出Vue:前言

    浅入深出Vue系列文章 之前大部分是在做后端,后来出于某些原因开始接触Vue.深感前端变化之大,各种工具.框架令人眼花缭乱.不过正是这些变化,让前端开发更灵活. 博主在刚开始时,参考官网的各个步骤以及 ...

随机推荐

  1. stm32f051 DMA需要注意的一点

    STM32f051的DMA注意事项 问题说明:在使用ADC的DMA通道时,遇到了序列转换的乱序问题,我使用的是DMA循环模式,但是采集的数据却总是错的:第二个内存地址存放的是ADC序列转换中的第一个通 ...

  2. Hadoop日记Day13---使用hadoop自定义类型处理手机上网日志

    测试数据的下载地址为:http://pan.baidu.com/s/1gdgSn6r 一.文件分析 首先可以用文本编辑器打开一个HTTP_20130313143750.dat的二进制文件,这个文件的内 ...

  3. Dynamics CRM Online Administrator password reset

    道道还挺多,好好看看 Dynamics CRM Online Administrator password reset

  4. cocos2d-x学习记录1——图片显示

    这篇算是cocos2d-x入门篇,显示一张图片即可. 观察工程中HelloWorld的结构,包含AppDelegate和HelloWorldScene两个类文件,AppDelegate中包含基本的处理 ...

  5. TDD 与 CI 在 Python 中的实践

    社区化产品的长久生存之道可能莫过于对迭代周期的控制.还记得以前采用老土的阶段开发的年代,将软件生命周期分为各个阶段,当到达每个阶段的里程碑则集中所有的资源.人力作全面冲刺.每次到了里程碑的检查点冲过了 ...

  6. 关于最近996.icu的一点感想

    最近这个996.ICU的话题讨论的火热,特别是一些业界大佬有直言不讳的说就是要996,有的弄些鸡汤文把996说成年轻人就该这样的.作为一个普通的码农,实在是看不下去了,在这里说些自己的看法,希望年轻人 ...

  7. Windows下fabric sdk连接Linux上fabric网络的调试过程

    上个月刚入职一家公司从事区块链研发工作,选型采用Hyperledger Fabric作为开发平台.团队的小组成员全部采用的是在VirtualBox上面安装桌面版的Ubuntu 16.04虚拟机,开发工 ...

  8. windows 64bit 服务器下安装32位oracle database 11g 问题集

    1.中文乱码 问题描述: 利用vs2008调试的时候正常,发布到IIS8.5上的时候,当查询语句中包含中文的时候会乱码,比如"select * from tb where name='小s' ...

  9. 开源中文分词框架分词效果对比smartcn与IKanalyzer

    一.引言: 中文分词一直是自然语言处理的一个痛处,早在08年的时候,就曾经有项目涉及到相关的应用(Lunce构建全文搜索引擎),那时的痛,没想到5年后的今天依然存在,切分效果.扩展支持.业务应用等方面 ...

  10. Alpha冲刺-第一天

    1.1 今日完成任务情况以及遇到的问题. 完成任务情况 杜世康:弹幕的爬取 刘丹,李玉莹:系统统计功能实现 曹莹雯,尹楠: 主播管理功能实现 王静雅 :团队编码规范说明与本次博文撰写 遇到的问题 在爬 ...