我想很好地掌握这个主题,因此想向社区提出以下问题:
最佳答案
What benefits do expression trees bring to table?
表达式树允许程序在运行时以简化的方式操作它自己的部分实现。它们允许表达式作为其结构的表示来传递,而不仅仅是可以调用的委托(delegate)。
What exactly does this statement mean: "Expression Trees are data compiled as code"?
C#/.NET 之前的语言已经支持这种操作……最好的例子是 LISP。在程序内的数据结构中表示程序结构的能力称为homoiconicity . C# 以表达式树的形式支持有限的同音性。 C# 语言允许从代码中的(子集)表达式透明地创建表达式树。例如:
int x = 3;
Expression<Func<bool>> IsXLessThan4Expr = () => x < 4;
Func<bool> IsXLessThan4 = () => x < 4;
变量
IsXLessThan4Expr
是从 lambda 表达式中捕获的表达式树。如果我们想了解它的结构是什么,我们现在可以遍历该表达式的表示 - 如果我们愿意,可以操纵它。代表IsXLessThan4
,相比之下,不能被检查......它只能被调用。当然,您总是可以获取任何方法的原始 IL(假设您拥有必要的权限)——但是从 IL 反转程序的逻辑结构比从表达式树反转要困难得多。What common challenges do the Expression Trees and functional programming in the context of .net solve?
使用表达式树解决重要问题的最佳示例是在 LINQ-to-SQL 中,其中
IQueryable
的实现能够将用 C# 编写的查询表达式树转换为可以由数据库执行的等效 SQL 查询。表达式树还使得动态生成 C# 代码成为可能——因为表达式树可以编译成 lambda。这是一个例子:
var paramNotification =
Expression.Parameter(typeof (NotificationEntry), "noti");
Func<NotificationEntry, bool> predicate =
m_PredicateExpr = Expression.Lambda<Func<NotificationEntry, bool>>(
Expression.LessThan(
Expression.Property(paramNotification, "Value"),
Expression.Constant(100)),
new[] {paramNotification})
.Compile();
上面的代码片段创建了一个比较
Value
的表达式。 NotificationEntry
的字段对象到某个提供的常量 (100) - 并将其编译成我们可以调用的 lambda。What are good online resources to get up the speed on the subject?
MSDN可能是您目前最好的选择。
关于.net - 表达式树.net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4145940/