c#之lamda表达式的前世今生

 最近在培训新同事时候发现大家linq都使用很溜,但是问其原理就说说不上来,linq非常方便,这得归功于lamda表达式的问世,趁今天有时间就写下这篇文章,希望对c#的爱好者起到一定的帮助。
同时也作为一个c#忠实拥护者,从1.0到4.0到net core,c#不断的给我们惊喜,下面就从lamda表达式来看一下微软为我们做了什么?

我们先来看下从 .Net Framework1.0到 .Net Framework3.0,委托传入参数的演变过程。

定义委托

在微软没有在框架中给我们定义Action和Func之前,使用委托必须进行生命,如下:

c#之lamda表达式的前世今生

使用委托

在.net Framework 1.0的时候,委托只能只能传入已经定义的方法

c#之lamda表达式的前世今生

其中方法DoNothing和DoSomething必须实现定义好。

匿名函数

在.net Framework 2.0的时候,微软发现为了委托专门定义一个方法太多此一举了,所以2.0可以通过delegate关键词传入匿名函数。

c#之lamda表达式的前世今生

 

lamda表达式的出现

在.net Framework 3.0的时候,delegate关键词完全可以省略了,代码如下

c#之lamda表达式的前世今生

其中的new实例化这种语法还可以直接省略不写,如下:

c#之lamda表达式的前世今生

如果存在下面情形,还可以进行简写

1、如果带参数,参数类型可以省略,编译器会根据委托定义时候的类型自动推算变量类型。

2、如果方法体只有一行,外面的大扩号还可以省略,最后的简写如下:

c#之lamda表达式的前世今生

这就是lamda表达式的由来。

其实lamda只是一个微软给我们定义好的语法糖,如果有兴趣的朋友可以通过ilspy参看中间il代码,会发现 你写的lamda表达式还是会创建一个用delegate关键词定义的匿名函数。

从上面的演变可以看出,微软尽可能的为我们简化代码,让程序猿更专注于业务本身而不是书写方式,这就是我为什么喜欢用c#的的原因。

题外话,到了.net Framework 4.0后,微软为我们定义了泛型委托Action和Fun,这样我们就不需要再只去定义委托了,直接用微软给我们定义的就可以,上面的委托可以写成下面的形式:

c#之lamda表达式的前世今生

是不是更方便了,所以即使在Java大行其道的今天,c#一直在没有停下脚步,不断的进步和增加使用体验,我也是我死忠c#的原因,等后面有时间我再写一篇关于linq的文章,然后封装一个我们自己的linq,让大家明白linq的原理。

posted @ 2019-12-17 17:58  鹅是码农  阅读(276)  评论(0编辑  收藏  举报