表达树.net

dex*_*ter 4 .net expression functional-programming expression-trees

我希望能够很好地掌握这个主题,因此想向社区提出以下问题:

  1. 表达树带来什么好处?
  2. 这句话到底意味着什么:"表达树是编译为代码的数据"?
  3. 在.net语境中表达树和函数式编程有哪些共同的挑战?
  4. 什么是良好的在线资源,以加快subj的速度?

LBu*_*kin 6

表达树带来什么好处?

表达式树允许程序以简化的方式在运行时操作它自己的实现的一部分.它们允许表达式作为其结构的表示传递,而不仅仅是可以调用的委托.

这句话到底意味着什么:"表达树是编译为代码的数据"?

C#/ .NET之前的语言支持这种操作......最好的例子是LISP.在程序内的数据结构中表示程序结构的能力被称为同质性.C#以表达式树的形式支持有限的同音性.C#语言允许从代码中的(子集)表达式透明地创建表达式树.例如:

int x = 3;
Expression<Func<bool>> IsXLessThan4Expr = () => x < 4;

Func<bool> IsXLessThan4 = () => x < 4;
Run Code Online (Sandbox Code Playgroud)

该变量IsXLessThan4Expr是从lambda表达式捕获的表达式树.如果我们想要理解它的结构是什么,我们现在可以遍历该表达式的表示 - 并且如果我们愿意,可以操纵它.IsXLessThan4相反,代表无法检查......它只能被调用.当然,您可以始终获得任何方法的原始IL(假设您具有必要的权限) - 但是从IL转换程序的逻辑结构比从表达式树转换要困难得多.

在.net语境中表达树和函数式编程有哪些共同的挑战?

使用表达式树来解决非平凡问题的最好例子是LINQ-to-SQL,其中的实现IQueryable能够将用C#编写的查询表达式树转换为可由数据库执行的等价SQL查询.

表达式树还可以动态生成C#代码 - 因为表达式树可以编译成lambdas.这是一个例子:

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();
Run Code Online (Sandbox Code Playgroud)

上面的代码片段创建了一个表达式,它将对象的Value字段NotificationEntry与某个提供的常量(100)进行比较 - 并将其编译为我们可以调用的lambda.

什么是良好的在线资源,以加快这个主题的速度?

MSDN可能是你目前最好的选择.


Jon*_*eet 5

  1. 它们带来了获取源代码并在执行时"理解"它的能力 - LINQ提供程序是其主要目标

  2. 好吧,表达式树通常是从源代码构建的(例如转换后的lambda表达式),但是代替将源代码编译成可执行的形式,它被构建到一个其他代码可以检查的树中.(更确切地说,编译器获取源代码,并发出可执行代码,然后在执行时构建表达式树.)

  3. 说实话,表达式树和函数式编程似乎与我正交.两者都经常处理高阶函数,但这就是它.

  4. 也许MSDN