首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Expression<Func<>>与Func<>的区别

Expression<Func<>>与Func<>的区别
EN

Stack Overflow用户
提问于 2010-04-19 09:57:07
回答 4查看 20.1K关注 0票数 81

例如,为什么大多数LINQ运算符接受Expression<Func<TSource>>和它的等效Func<TSource>

使用泛型Expression类而不是直接使用lambda语法的好处/原因是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-19 09:59:01

使用Expression<T>,您将显式地创建一个 -这意味着您可以像处理数据一样处理构成查询的代码。

这样做的原因是LINQ提供程序(例如LINQ to SQL )会检查查询本身,以确定将C#表达式转换为T-SQL查询的最佳方法。由于表达式树允许您将代码视为数据,因此提供程序能够做到这一点。

票数 63
EN

Stack Overflow用户

发布于 2010-04-19 10:09:11

总而言之,两者之间的主要区别如下:

  • Expression<Func<...>>是一个表示原始源代码的表达式树(它存储在与原始C#代码非常接近的树状数据结构中)。在这种形式下,你可以分析源代码,像LINQ to SQL这样的工具可以将表达式树(源代码)翻译成其他语言(例如,SQL在LINQ to SQL的情况下,但你也可以针对例如JavaScript)。
  • Func<...>是一个可以执行的普通委托。在这种情况下,编译器将函数体编译为中间语言(IL),就像编译标准方法一样。

值得一提的是,Expression<..>有一个在运行时编译表达式并生成Func<...>Compile方法,因此需要从第一个表达式转换到第二个表达式(以一定的性能为代价)。然而,没有从第二个到第一个的转换,因为一旦你得到了IL,就很难(不可能)重建原始的源代码。

票数 35
EN

Stack Overflow用户

发布于 2010-04-19 10:02:12

Func<T>创建一个可执行函数。

Expression<Func<T>>创建了一个表达式树,允许您将函数中的代码作为数据使用。

表达式树允许您通过从.NET代码生成底层调用来执行诸如LINQ to SQL和LINQ to XML之类的操作。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2664841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档