您知道C#中的Lambda表达式的演化过程吗

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

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

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

委托的使用

例一:

您知道C#中的Lambda表达式的演化过程吗

什么是委托?

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

例二:

您知道C#中的Lambda表达式的演化过程吗

又经过了很久很久...

匿名方法

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

例三:

您知道C#中的Lambda表达式的演化过程吗

我们可以写成:

您知道C#中的Lambda表达式的演化过程吗

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

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

Func和Action

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

先说Func:

您知道C#中的Lambda表达式的演化过程吗

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

您知道C#中的Lambda表达式的演化过程吗

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

您知道C#中的Lambda表达式的演化过程吗

再看Action:

您知道C#中的Lambda表达式的演化过程吗

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

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

Lambda的诞生

您知道C#中的Lambda表达式的演化过程吗

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

我们继续简化:

您知道C#中的Lambda表达式的演化过程吗

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

还可以简化吗?当然:

您知道C#中的Lambda表达式的演化过程吗

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

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

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

您知道C#中的Lambda表达式的演化过程吗

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

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

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

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

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

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

您知道C#中的Lambda表达式的演化过程吗

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

 

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

您知道C#中的Lambda表达式的演化过程吗

 

本文简短的说了下lambda表达式在C#中的一步步演化(请不要太纠结先后顺序)。说的不一定对,轻拍!

文章首链:http://www.cnblogs.com/zhaopei/p/5767631.html

感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。

 

17楼Riker.Gi
测试
16楼longware
不喜欢Lamdba
15楼查克拉的觉醒
先顶一下, 这个我要说一下,之前正好看过这个演变的视频, ,,最初就是委托, 然后委托太麻烦,还要单独定义一个方法来接收,所以有了匿名委托;而匿名委托写的还是很麻烦,所以有了Lambda语句, 而最后我连括号,花括号都不要了,最终演变成Lambda表达式
14楼一抹嫣红
支持!
13楼Darren01
群主最后一张图是不是有问题啊:正确的应该是两个参数吧:,Funclt;string,intgt; d4 = (string text) =gt; { return text.Length;
12楼谁的青春不迷茫
坚持更新不容易,看了楼主的文章复习了一下基础知识点,感觉挺不错的。支持一下!!!
11楼大萝卜控
Lamdba表达式的由来请参看Lisp语言。。。
Re: 农码一生
@大萝卜控,引用Lamdba表达式的由来请参看Lisp语言。。。 ,Lisp传说中的东西,表示没接触过。
10楼馨辰
我也以为你要的说的是Lisp之类的语言。。。
9楼梵哥
说的浅了点
8楼kangyangyang
不错。加油!
Re: 农码一生
@kangyangyang,引用不错。加油! ,还好,还有人支持。
7楼乐荷
学习一下
6楼mspeer
支持
5楼唱歌的小猫
占个沙发先
4楼Sam Xiao
http://www.cnblogs.com/xcj26/p/3536082.html,,我的这篇博客和你的差不多。
Re: 农码一生
@Sam Xiao,引用http://www.cnblogs.com/xcj26/p/3536082.html,,我的这篇博客和你的差不多。 ,,,嗯,看了。,,没你写得好,以至于好多反对。,
3楼胖子黎
写的什么,完全 牛头不对马嘴.
2楼Z13区
了解技术的历程,对于后期编码及源码的分析非常重要,感谢博主,期待后期更多分享
1楼杰哥要学习了
哈哈 好文要顶,action原来是这么用的