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

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

概述那得从很久很久以前说起了,记得那个时候...懵懂的记得从前有个叫委托的东西是那么的高深难懂。委托的使用例一:什么是委托?个人理解:用来传递方法的类型。(用来传递数字的类型有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)Func<Student, Task<bool>> func = async t =>{await Task.Delay(100);//等待100毫秒return false;}; 结束:本文简短的说了下lambda表达式在C#中的一步步演化。说的不一定对,轻拍!本文以同步至《C#基础知识巩固系列》

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

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

委托的使用

例一:

什么是委托?

个人理解:用来传递方法的类型。(用来传递数字的类型有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)

Func>> func = t => Task.Delay();

结束:

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

本文以同步至《href="http://www.cnblogs.com/zhaopei/p/Indexes.HTML#autoID-0-0" target="_blank">C#基础知识巩固系列》

总结

以上是内存溢出为你收集整理的你知道C#中的Lambda表达式的演化过程吗?全部内容,希望文章能够帮你解决你知道C#中的Lambda表达式的演化过程吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1264193.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存