您知道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
感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。
- 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原来是这么用的