解析表达式树的成本是否很高
本文关键字:是否 表达式 | 更新日期: 2023-09-27 17:57:00
我目前正在通读MSDN,演练:创建一个IQueryable LInQ提供程序,并且有很多ExpressionVisitor
的使用。
这让我想知道,使用它是一项昂贵的操作吗?
它和反射一样贵吗?
不,遍历带有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 文档中的工作示例。涉及一些反射(例如MemberExpressions
持有PropertyInfo
参考),但这一切都非常快。
如果你有一个你担心的应用,你应该分析它(例如,最新版本的Visual Studio有一个内置的性能探查器),并查看哪些特定部分很慢。