举个例子,为什么大多数LINQ运算符都接受Expression<Func<TSource>>它的等价物Func<TSource>呢?
使用泛型Expression类而不是直接lambda语法的好处/原因是什么?
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等操作.
An Expression<Func<>>是尚未转换为代码的函数的表示.A Func<>是实际的可执行函数.使用前者允许您在调用表达式时将表达式转换为适当的函数.例如,使用LINQ to SQL,这会将其转换为执行SQL语句并返回指定内容的等效代码.使用LINQ to对象,它将使用CLR在客户端上执行代码.A Func<>总是在CLR中执行 - 它是可执行代码.
| 归档时间: |
|
| 查看次数: |
17217 次 |
| 最近记录: |