代码之家  ›  专栏  ›  技术社区  ›  dexter

表达式树.NET

  •  4
  • dexter  · 技术社区  · 15 年前

    我想对这个问题有一个很好的了解,因此我想向社区提出以下问题:

    1. 表达树带来了什么好处?
    2. 这句话的确切意思是:“表达式树是作为代码编译的数据”?
    3. 在.NET环境中,表达式树和函数式编程解决了哪些常见的挑战?
    4. 有什么好的在线资源可以提高SubJ的速度?
    2 回复  |  直到 15 年前
        1
  •  5
  •   Jon Skeet    15 年前
    1. 它们带来了获取源代码并在执行时“理解”它的能力——Linq提供者是这一点的主要目标

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

    3. 老实说,表达式树和函数编程对我来说似乎有些正交。两者都经常处理高阶函数,但这就是问题所在。

    4. MSDN perhaps ?

        2
  •  6
  •   LBushkin    15 年前

    表达树带来了什么好处?

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

    这句话的确切意思是:“表达式树是作为代码编译的数据”?

    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反转程序的逻辑结构要比从表达式树反转程序的逻辑结构困难得多。

    在.NET环境中,表达式树和函数式编程解决了哪些常见的挑战?

    使用表达式树来解决一个非常重要的问题的最佳示例是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 A的字段 NotificationEntry 对象,并将其编译为我们可以调用的lambda。

    有什么好的在线资源可以提高这个主题的速度?

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

    推荐文章