表达式<Func <>>和Func <>之间的区别

Vin*_*cio 77 c# linq

举个例子,为什么大多数LINQ运算符都接受Expression<Func<TSource>>它的等价物Func<TSource>呢?

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

And*_*are 59

使用Expression<T>您正在显式创建表达式树 - 这意味着您可以处理构成查询的代码,就像它是数据一样.

原因是LINQ提供程序(例如LINQ to SQL)检查查询本身以确定将C#表达式转换为T-SQL查询的最佳方法.由于表达式树允许您将代码视为数据,因此提供程序可以执行此操作.

  • 不要忘记表达式树不再是LINQ提供程序所独有的 - 例如,它们是动态语言运行时的主要基本概念之一. (5认同)

Tom*_*cek 32

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

  • Expression<Func<...>>是表示原始源代码的表达式树(它存储在与原始C#代码非常接近的树状数据结构中).在这种形式中,您可以分析源代码和LINQ to SQL等工具可以将表达式树(源代码)转换为其他语言(例如,在LINQ to SQL的情况下使用SQL,但您也可以使用例如JavaScript).

  • Func<...>是一个普通的代表,你可以执行.在这种情况下,编译器将函数体编译为中间语言(IL),就像编译标准方法一样.

值得一提的是,Expression<..>有一种Compile方法可以在运行时编译表达式并生成Func<...>,因此存在从第一个到第二个的转换(具有一些性能成本).但是,没有从第二个到第一个的转换,因为一旦获得IL,重建原始源代码是非常困难的(不可能的).


Jus*_*ner 20

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

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

表达式树允许您通过从.NET代码生成基础调用来执行LINQ to SQL和LINQ to XML等操作.

  • 谢谢你用更少的单词;) (5认同)
  • @jolySoft更少的话.:) (2认同)

tva*_*son 7

An Expression<Func<>>是尚未转换为代码的函数的表示.A Func<>是实际的可执行函数.使用前者允许您在调用表达式时将表达式转换为适当的函数.例如,使用LINQ to SQL,这会将其转换为执行SQL语句并返回指定内容的等效代码.使用LINQ to对象,它将使用CLR在客户端上执行代码.A Func<>总是在CLR中执行 - 它是可执行代码.