.net - 表达式树.net

标签 .net functional-programming expression expression-trees

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

  • 表达树有什么好处?
  • 这句话到底是什么意思:“表达式树是编译为代码的数据”?
  • .net 上下文中的表达式树和函数式编程解决了哪些常见挑战?
  • 有什么好的在线资源可以加快主题的速度?
  • 最佳答案

    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/

    相关文章:

    .net - 提取文本以进行国际化

    c# - 绘制矩形时出现这种奇怪异常的原因是什么?如何确定?

    haskell - Haskell 中的内存

    java - java中需要的复杂正则表达式帮助

    java - java的正则表达式

    javascript - 大括号对象符号在任何表达式中都有效吗?

    .net - .NET 中的连接池

    c# - 如何使我的 WCF 服务调用通过已配置的本地代理服务器?

    javascript - 以函数式风格应用于字符串的函数序列

    powershell - 在PowerShell中使用Monad?