解析ExpressionTree是否昂贵?

Phi*_*ens 5 c# linq expression-trees

我目前正在阅读MSDN,演练:创建一个IQueryable LInQ提供程序,并且有很多用途ExpressionVisitor.

这让我很奇怪,使用它是否是一项昂贵的操作?

它和反射一样昂贵吗?

Ric*_*ich 1

不,用 . 遍历表达式树应该是相当便宜的ExpressionVisitor

解析表达式树根本不需要任何运行时成本。编译器在编译时完成将表达式转换为对象树的所有工作。当在内存中创建相关对象时,甚至没有发生太多运行时反射。当您看到如下方法调用时:

SomeMethod(Foo x => x.Property);
Run Code Online (Sandbox Code Playgroud)

并且 SomeMethod 的参数被Expression输入,然后编译器将代码转换为 IL,其行为就像您编写了这样的内容:

SomeMethod(new MemberExpression {
  Expression = new ParameterExpression("x", typeof(Foo)),
  Member = typeof(Foo).GetProperty("Property")
});
Run Code Online (Sandbox Code Playgroud)

您可以查看生成的 IL 以获取完整的详细信息,或者查看Microsoft 文档中的工作示例。涉及一些反射(例如MemberExpressions保留PropertyInfo引用),但这一切都非常快。

如果您有一个您担心的应用程序,您应该对其进行分析(例如,最新版本的 Visual Studio 有一个内置的性能分析器)并查看哪些特定部分速度较慢。