你知道C#中的Lambda表达式的演化过程吗
你知道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点,lambda我们平时用得较多的是基于IEnumerable或IQueryable,所以只能有一个参数也就满足了。
关于第2点,我们使用扩展方法的链式编程来解决。
如:(用链式来解决第二点)

从此,我们过上了幸福的生活...
借《深入理解C#》中的一图:

本文简短的说了下lambda表达式在C#中的一步步演化(请不要太纠结先后顺序)。说的不一定对,轻拍!
文章首链:http://www.cnblogs.com/zhaopei/p/5767631.html
感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。
你知道C#中的Lambda表达式的演化过程吗的更多相关文章
- 【转】你知道C#中的Lambda表达式的演化过程吗?
[转]你知道C#中的Lambda表达式的演化过程吗? 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传 ...
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- C#中的Lambda表达式的演化过程
原文:http://www.cnblogs.com/zhaopei/p/5767631.html
- 个人理解的Lambda表达式的演化过程
之前在组内进行过相关分享,为防止以后再单独整理,故在此将自己的PPT内容存放下. 所以,多数代码都是以图片的方式展现. 委托 什么是委托? 定义:委托是方法的抽象,它存储的就是一系列具有相同签名和返回 ...
- C#中的Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- C++11中的Lambda表达式
原文地址:C++中的Lambda表达式 作者:果冻想 一直都在提醒自己,我是搞C++的:但是当C++11出来这么长时间了,我却没有跟着队伍走,发现很对不起自己的身份,也还好,发现自己也有段时间没有写C ...
- Qt5中使用lambda表达式
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- Lambda 表达式,Java中应用Lambda 表达式
一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...
- 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join
在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...
随机推荐
- Bootstrap学习笔记系列2-------Bootstrap简单表格处理
标签 <table> 为表格添加基础样式 <thead> 表格标题行的容器元素,用来识别列 <tbody> 表格主提中的表格行的容器元素 <tr> 单行 ...
- Android经典完美退出方法
Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...
- iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】
在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...
- IIS 7.5 应用程序池预热模块组件
预热组件下载地址:下载地址 IIS预热模块配置界面插件:下载地址 Warm Up设定方式: (1) 应用程序池层级:只要有需要的应用程序池的Start Mode设定AlwaysRunning就可以 ( ...
- LeetCode3:Longest Substring Without Repeating Characters
题目: Given a string, find the length of the longest substring without repeating characters. For examp ...
- 似乎都设置了utf-8,为什么出现乱码
解决方法如下: ****************************************************************************************[来自我 ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- 说说web 2.0生态圈的那些事
先来说一道面试题吧,“说一下,web 2.0 和web 1.0的区别?” 官方的解释是这样的: Web1.0 的主要特点在于用户通过浏览器获取信息,Web2.0 则更注重用户的交互作用,用户既是网站内 ...
- VS code 安装react-native代码提醒
上GitHub:https://github.com/Microsoft/vscode-react-native Getting started Install VS Code (0.10.10+ i ...
- MyEclipse常用插件使用教程
一.Findbugs 1. 配置 1.1 打开FindBugs视图: Windows => Show View => Other… => FindBugs => Bug Inf ...