Expression和Func之间的区别

dev*_*per 7 c#

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

Jon*_*eet 13

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

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

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

Expression<Func<int, int>> square = x => x * x;
Func<int, int> square = x => x * x;
Run Code Online (Sandbox Code Playgroud)

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

// Compile-time error
Expression<Func<int, int>> square = x => { return x * x; };
// Works fine
Func<int, int> square = x => { return x * x; };
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 7

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

我在这里更多地讨论这个:解释表达,但是配方是LINQ,RPC等的关键.当然,如果你有食谱,你可以自己做厨师Expression.Compile().