c# - 解析 ExpressionTree 的开销大吗?

标签 c# linq expression-trees

我目前正在阅读 MSDN,Walkthrough: Creating an IQueryable LInQ Provider ExpressionVisitor 有很多用途。

这让我想知道,使用它是不是一个昂贵的操作?

它和 Reflection 一样昂贵吗?

最佳答案

不,用 ExpressionVisitor 遍历表达式树应该很便宜。

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

SomeMethod(Foo x => x.Property);

并且 SomeMethod 的参数是 Expression 类型的,然后编译器将代码转换为 IL,就像你写了这样的东西一样:

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

您可以查看生成的 IL 以获得完整的详细信息,或者查看 Microsoft's documentation 中的工作示例. 涉及到一些反射(例如 MemberExpressions 包含一个 PropertyInfo 引用),但速度非常快。

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

关于c# - 解析 ExpressionTree 的开销大吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14659406/

相关文章:

c# - 将强类型属性名称作为参数传递

c# - 在 Xamarin 中从 JavaScript 调用 C#

c# - 如果值在不同的表中,Linq 查询不会返回正确的结果

javascript - 在 Javascript 中评估表达式树

c# - 使用 LINQ 加密列数据

c# - 禁用设置驻留在预制件中的变换的父级以防止数据损坏

c# - 如何更好地组合从一个接口(interface)继承的不同类型的通用列表?

c# - 自定义 Where 表达式

c# - 表达式解析 - 可以将属性名称数组作为字符串获取吗?

javascript - 表达式的单变量导数(符号)