Expression和Func之间的区别

时间:2010-06-26 08:02:17

标签: c#

Expression和Func有什么区别?两者都可以完成同样的任务。那有什么区别?

4 个答案:

答案 0 :(得分:13)

Expression trees是逻辑的数据表示 - 这意味着可以在LINQ提供程序等执行时检查它们。他们可以解决代码的含义,并可能将其转换为另一种形式,例如SQL。

然而,Func类型系列只是代表。它们最终成为正常的IL,可以直接执行,但不能(轻松)检查。请注意,如果需要,您可以将表达式树(例如,Expression<T>LambdaExpression)编译到委托中,并在托管代码中执行这些树。

您可以使用Expression类中的工厂方法手动构建表达式树,但通常只使用C#可以将 lambda表达式转换为表达式树和普通委托的事实:

Expression<Func<int, int>> square = x => x * x;
Func<int, int> square = x => x * x;

请注意,lambda表达式可以转换为表达式树存在限制。最重要的是,只能转换由单个表达式(而不是语句体)组成的lambdas:

// Compile-time error
Expression<Func<int, int>> square = x => { return x * x; };
// Works fine
Func<int, int> square = x => { return x * x; };

答案 1 :(得分:7)

“他们做同样的事情”并不是真的。 Expression以可以在运行时解释的方式描述您的意图 - 如果您愿意,也可以是食谱。函数是一个不透明的委托,不能被检查 - 它可以用作黑盒子。与食谱相比,它是某种自动厨师,不会让你看到它的作用:给它一些面包和一些鸡肉,闭上眼睛,它给你一个三明治,但你永远不会知道如何

我在这里讨论更多:Explaining Expression,但是配方是LINQ,RPC等的关键。当然,如果你有食谱,你可以通过Expression.Compile()制作自己的厨师。

答案 2 :(得分:3)

表达式可以在运行时构建,不起作用(除非你使用反射发射)。构建表达式树后,您可以编译它并将其转换为可以调用的函数指针。 Func是指向一些已经存在的函数的指针,当您编译它时,Expression表示某些函数的代码,而这些函数在编译之前不再被修改。

答案 3 :(得分:0)

如果要保留代码的语义,通常可以使用表达式,以便翻译它。也就是说,表达式允许您将代码视为数据。如果代码不需要被视为数据(即您不打算存储或翻译它),那么使用Func是合适的。