我已经阅读了几篇关于表达式树的文章和几个stackoverflow.com帖子。它在跳动我的大脑来理解。
问题:
1)像DOM(文档对象模型)一样,它是逻辑的内存表示?
2)有人解释说这是一种将可执行代码转换为数据的机制,使用它我们可以生成表示代码的数据结构。
这是否意味着,表达式树用于设计用户定义的模式?
3)大多数示例显示表达式树与Func<>
委托或其他委托一起使用,因此使用委托和其他编程结构不能实现与表达式树相同的事情。
初学者可以理解的解释受到高度赞赏。
我已经阅读了几篇关于表达式树的文章和几个stackoverflow.com帖子。它在跳动我的大脑来理解。
问题:
1)像DOM(文档对象模型)一样,它是逻辑的内存表示?
2)有人解释说这是一种将可执行代码转换为数据的机制,使用它我们可以生成表示代码的数据结构。
这是否意味着,表达式树用于设计用户定义的模式?
3)大多数示例显示表达式树与Func<>
委托或其他委托一起使用,因此使用委托和其他编程结构不能实现与表达式树相同的事情。
初学者可以理解的解释受到高度赞赏。
表达式树表示单个表达式的语法树。
树的每个节点代表一些常量、对象成员引用或操作。
例如,对于表达式2 + 3
,我们可以构建表达式树:
Expression.MakeBinary(
ExpressionType.Add,
Expression.Constant(2),
Expression.Constant(3));
此类树中最重要的是 Expression,它允许以可读的形式编写表达式,提醒 lambda 函数签名匹配 TDelegate。这是前任
Expression<Func<int>> sum = () => 2 + 3; // much nicer, eh?
但 Expression 不是委托,因为它不能直接执行。
相反,它可以通过访问者对象进行遍历,以构建一些可执行的表示。示例可以是使用 Expression.Compile() 的委托构建或使用 CompiledQuery.Compile() 等从 LINQ 查询构建的 SQL 查询。
表达式树的另一个有用应用是使用它们来表示需要使用反射的对象的成员。反射使用字符串来表示成员名称,并且在编译时不进行检查。检查表达式树,因此可以减少一点错误。
PropertyInfo prop1 = typeof(MyClass).GetProperty("Value");
Expression<Func<MyClass, int>> expr = mc => mc.Value;
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo;
Expression
是一种将代码操作表示为对象模型的通用方式。这在 4.0 中得到了更多扩展,但这是我经常使用的领域;我在这里有一些博客点,或者在InfoQ上尝试解释这一切。我也曾多次介绍过这个主题——也许可以在这里尝试下载(但如果没有这些词,它就没有多大意义;抱歉)。
我会诚实的;这不是一个简单的主题——但当你深入了解它时,它会非常强大。综上所述,我可能会从 InfoQ 开始。
这是一篇解释基础知识的文章...
简而言之:
1)基本上,是的,它是逻辑的内存表示。
2) 它可以编译为 MSIL(或者,在 LINQ-to-SQL 的情况下,也可以编译为其他语言)。
3) 使用 Func<> 委托是因为它们用于将表达式表示为可调用函数(在内部编译为 MSIL)。
I have tried to answer questions like yours on C# FAQ blog in the following blog post: Generating Dynamic Methods with Expression Trees in Visual Studio 2010. So, yes, it is in-memory. I don't understand what you mean by "user-defined patterns", but you can use it to write dynamic code. And no, you can't replace ETs with delegates, becuase you can't modify delegates at run-time. The only substituion can be MSIL, which is much harder to read and write.
我不是这方面的专家,但我会尽力为你扫清障碍。
将表达式树视为类型化反射。这是了解函数具有什么功能的简单方法,例如操作数、参数和其他内容。
所以,
1)我会说是的。
2)不完全是......你应该先学习这个功能(我也是)然后找到它的好处。你在生成代码吗?这对我来说可能是表达式树的一个非常有用的特性
3) 表达式树它是一个新特性,但没有什么是你以前不能做的。现在它更容易了。
这里有一篇很好的文章解释了基础知识。