例如,为什么大多数LINQ运算符接受Expression<Func<TSource>>和它的等效Func<TSource>
使用泛型Expression类而不是直接使用lambda语法的好处/原因是什么?
发布于 2010-04-19 09:59:01
使用Expression<T>,您将显式地创建一个 -这意味着您可以像处理数据一样处理构成查询的代码。
这样做的原因是LINQ提供程序(例如LINQ to SQL )会检查查询本身,以确定将C#表达式转换为T-SQL查询的最佳方法。由于表达式树允许您将代码视为数据,因此提供程序能够做到这一点。
发布于 2010-04-19 10:09:11
总而言之,两者之间的主要区别如下:
Expression<Func<...>>是一个表示原始源代码的表达式树(它存储在与原始C#代码非常接近的树状数据结构中)。在这种形式下,你可以分析源代码,像LINQ to SQL这样的工具可以将表达式树(源代码)翻译成其他语言(例如,SQL在LINQ to SQL的情况下,但你也可以针对例如JavaScript)。Func<...>是一个可以执行的普通委托。在这种情况下,编译器将函数体编译为中间语言(IL),就像编译标准方法一样。值得一提的是,Expression<..>有一个在运行时编译表达式并生成Func<...>的Compile方法,因此需要从第一个表达式转换到第二个表达式(以一定的性能为代价)。然而,没有从第二个到第一个的转换,因为一旦你得到了IL,就很难(不可能)重建原始的源代码。
发布于 2010-04-19 10:02:12
Func<T>创建一个可执行函数。
Expression<Func<T>>创建了一个表达式树,允许您将函数中的代码作为数据使用。
表达式树允许您通过从.NET代码生成底层调用来执行诸如LINQ to SQL和LINQ to XML之类的操作。
https://stackoverflow.com/questions/2664841
复制相似问题