lambda表达式

栏目: IT技术 · 发布时间: 5年前

后续所有文章都以短文形式来阐述,若为长文将分为多篇分开讲解,同时代码将沿袭最近文章所示而非截图,相信通过如此改善能较好提高阅读体验。

有一部分童鞋对lambda表达式并不是十分了解和清楚,比如说说如下二者的区别在哪里?

Func<int, int> code = x => x + 1;

Expression<Func<int, int>> data = x => x + 1;

在完成上述分配后,我们了解到委托和表达式都可以表达lambda表达式,二者的区别在于 通过委托表示引用返回x+1的方法,表达式树引用描述表达式x=>x+1的数据结构

通过委托表示的表达式是可执行代码,通过表达式树是数据结构,也就是说表达式可通过可执行代码和数据结构来表示。

表达式树允许将lambda表达式表示为数据结构而不是可执行代码,表达式树是形式为System.Linq.Expressions.Expression<D>的表达式树类型的值,其中D是任何委托类型。

如果存在从lambda表达式到委托类型D的转换,则也存在到表达式树类型Expression<D>的转换,将lambda表达式转换为委托类型会生成引用了lambda表达式的可执行代码的委托,而转换为表达式树类型则会创建lambda表达式的表达式树表示形式。

表达式树是lambda表达式的有效内存数据表示形式,并使lambda表达式的结构透明且显式。就像委托类型D一样,Expression<D>据说具有参数和返回类型,与D相同。

表达式树提供了实例方法Compile,该方法将编译生成类型为D的委托,也就是说将所描述的数据结构通过此方法编译成可执行的代码,如下:

  Expression<Func<int, int>> data = x => x + 1;

  Func<int, int> exp = data.Compile();

  var result = exp(1);

  Console.WriteLine(result);

并非所有的lambda表达式都可转换为表达式树,在如下情况下,转换仍然存在,但在编译时将失败。

  • 有块体

 Expression<Func<int, int>> data = x => { return x + 1 };
  • 包含简单或复合赋值运算符

Expression<Func<int, int>> data = x => x++;
  • 包含动态绑定的表达式

Expression<Func<int, int>> data = x => (dynamic)x + 1;
  • 异步表达式

 Expression<Func<int, Task<int>>> data = async x => x + 1;

并非所有的lambda表达式都可转换为委托类型,比如如下存在类型转换错误

 Func<double, int> code = x => x + 1;

很显然编译时出现错误,因为当x的类型为double类型时,x +1的结果(double类型)不能隐式转换为int类型。

如上匿名异步函数不可转换为表达式树,但可转换为委托类型,因为x +1的结果(类型为int)可以隐式转换为任务类型Task<int>的结果类型int 

 Func<int, Task<int>> code = async x => x + 1;

以上所述就是小编给大家介绍的《lambda表达式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字化生存

数字化生存

(美)Nicholas Negroponte(尼古拉·尼葛洛庞帝) / 胡泳、范海燕 / 电子工业出版社 / 2017-1-1 / 68.00

《数字化生存》描绘了数字科技为我们的生活、工作、教育和娱乐带来的各种冲击和其中值得深思的问题,是跨入数字化新世界的*指南。英文版曾高居《纽约时报》畅销书排行榜。 “信息的DNA”正在迅速取代原子而成为人类生活中的基本交换物。尼葛洛庞帝向我们展示出这一变化的巨大影响。电视机与计算机屏幕的差别变得只是大小不同而已。从前所说的“大众”传媒正演变成个人化的双向交流。信息不再被“推给”消费者,相反,人们或他......一起来看看 《数字化生存》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具