那得从好久好久之前提及了,记得那个时候...html
懵懂的记得从前有个叫委托的东西是那么的高深难懂。编程
例一:框架
什么是委托?异步
我的理解:用来传递方法的类型。(用来传递数字的类型有int、float、double,用来传递方法的就有委托)async
例二:spa
又通过了好久好久...code
不少时候委托接收的方法是一次性的或者方法体是很是简单的...htm
例三:blog
咱们能够写成:get
有没有发现咱们每次都要定义委托,不少时候签名多是同样的。这样就没有必要定义重复的。
而后又过了好久好久...
可能老大也以为咱们每次定义委托有点傻,因此干脆在框架内一次定义好全部可能用到的委托。那变幻无穷的方法签名怎么可能定义得全?不要紧,定义成泛型的不就能够了吗。
先说Func:
细心的朋友可能看到了,Func相对于AddDelegate多定义了一个int。多出了的那个是指的是返回类型。咱们F12看对应的定义:
关于上面Func的写法咱们能够简写成:(语法糖而已,编译后仍是注释的代码)
再看Action:
提醒:之后若是咱们写代码的时候若是写到到delegate...,你要立刻想到是否能够用Func或者Action来代替呢?C#4中的Action和Func有16个参数,足够你用了。
咱们等了又等,又过了很久很久...
我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#基础知识巩固系列》