【转】你知道C#中的Lambda表达式的演化过程吗?

那得从很久很久以前说起了,记得那个时候...

懵懂的记得从前有个叫委托的东西是那么的高深难懂。

委托的使用

例一:

什么是委托?

个人理解:用来传递方法的类型。(用来传递数字的类型有int、float、double,用来传递方法的就有委托

例二:

又经过了很久很久...

匿名方法

很多时候委托接收的方法是一次性的或者方法体是非常简单的...

例三:

我们可以写成:

有没有发现我们每次都要定义委托,很多时候签名可能是一样的。这样就没有必要定义重复的。

然后又过了很久很久...

Func和Action

可能老大也觉得我们每次定义委托有点傻,所以干脆在框架内一次定义好所有可能用到的委托。那千变万化的方法签名怎么可能定义得全?没关系,定义成泛型的不就可以了吗。

先说Func:

细心的朋友可能看到了,Func相对于AddDelegate多定义了一个int。多出了的那个是指的是返回类型。我们F12看对应的定义:

关于上面Func的写法我们可以简写成:(语法糖而已,编译后还是注释的代码

再看Action:

提醒:以后如果我们写代码的时候如果写到到delegate...,你要马上想到是否可以用Func或者Action来代替呢?C#4中的Action和Func有16个参数,足够你用了。

我们等了又等,又过了好久好久...

Lambda的诞生

我XX,这TM就是亲兄弟啊。直接去掉delegate关键字,然后加一个=>就成了lambda表达式了。(=>读作goes to

我们继续简化:

丢掉参数类型也是可以的,因为强大的VS可以根据泛型委托Func自己推断出来参数类型。

还可以简化吗?当然:

return关键字也不要了,大括号也不要了。(当然,方法体只有单条语句才能怎么做

现在看起来已经非常接近我们平时用的Lambda表达式了。

如果传入参数只有一个的话,我们还可以继续简化:

这就是我们平时见得最多的lambda长相了。

要长成这样也是有要求的:

  1. 只能有一个传入参数
  2. 方法体只能只一条语句。

关于第1点,lambda我们平时用得较多的是基于IEnumerable或IQueryable,所以只能有一个参数也就满足了。

关于第2点,我们使用扩展方法的链式编程来解决。

如:(用链式来解决第二点)

从此,我们过上了幸福的生活...

借《深入理解C#》中的一图:

小知识:(异步Lambda)

Func<Student, Task<bool>> func = async t =>
{
await Task.Delay();//等待100毫秒
return false;
};

结束:

本文简短的说了下lambda表达式在C#中的一步步演化。说的不一定对,轻拍!

本文以同步至《C#基础知识巩固系列

【转】你知道C#中的Lambda表达式的演化过程吗?的更多相关文章

  1. 你知道C#中的Lambda表达式的演化过程吗

    你知道C#中的Lambda表达式的演化过程吗? 阅读目录 委托的使用 匿名方法 Func和Action Lambda的诞生 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西 ...

  2. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  3. C#中的Lambda表达式的演化过程

    原文:http://www.cnblogs.com/zhaopei/p/5767631.html

  4. 个人理解的Lambda表达式的演化过程

    之前在组内进行过相关分享,为防止以后再单独整理,故在此将自己的PPT内容存放下. 所以,多数代码都是以图片的方式展现. 委托 什么是委托? 定义:委托是方法的抽象,它存储的就是一系列具有相同签名和返回 ...

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

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

  6. C++11中的Lambda表达式

    原文地址:C++中的Lambda表达式 作者:果冻想 一直都在提醒自己,我是搞C++的:但是当C++11出来这么长时间了,我却没有跟着队伍走,发现很对不起自己的身份,也还好,发现自己也有段时间没有写C ...

  7. Qt5中使用lambda表达式

    c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...

  8. Lambda 表达式,Java中应用Lambda 表达式

    一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...

  9. 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join

    在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...

随机推荐

  1. Pandas操作数据库及保存csv

    数据的保存 import pandas as pd import numpy as np from pandas import Series col_db = [['one',1,2,3,4,np.n ...

  2. jenkin、SVN、archery集成openLDAP

    jenkins: 1.下载.安装插件 LDAP .Matrix Authorization Strategy 2. 系统管理 —> 全局安全配置 点击 启用安全,并且选择 LDAP 认证,这里有 ...

  3. elasticsearch 不同集群数据同步

    采用快照方式 1.源集群采用NFS,注意权限 2.共享目录完成后,在所有ES服务器上挂载为同一目录 3.创建快照仓库 put _snapshot/my_backup{ "type" ...

  4. Nginx 功能

      本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得,欢迎留言交流. Nginx能做什么 ...

  5. HDU-1087.SuperJUmpingJUmpingJumping.(DP and LISPP)

    本题大意:给定一个长度为n的序列a,让你输出这个序列子序列中元素和最大的最大上升子序列. 本题思路:一开始肯定可以想到用LIS实现,我们用LIS实现的时候可以发现这个问题并不满足LIS问题的最优子结构 ...

  6. Delphi:基于jcl的Bugsplat Crash收集单元

    //BugSplat Crash模拟.net数据封装 unit uBugSplat; interface uses Windows, SysUtils, Classes, StrUtils, Shel ...

  7. java 线程Thread 技术--1.5 Future与Callable

    Callable: 从官方文档说起: 通过实现callable 的called 方法可以使一个任务可以返回一个结果以及可能抛出一个异常: callable 与runnable 是相似的,可以被其他线程 ...

  8. 读取properties文件的信息

    1.properties配置文件的信息 fcsimage_path=C://FCSImage 2.Java代码 public final class Config { private static f ...

  9. mysqldump 导出数据库各参数详细说明

    mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等. 下面我们详细介绍一下mysqldu ...

  10. Repeater绑定数组

    前台代码: <asp:Repeater ID="rptarry" runat="server" >         <HeaderTempla ...