科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件掌握表达式树

掌握表达式树

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 对于熟悉函数式编程语言的开发者而言,可能不需要再解释为什么说“表达式树(即Expression Tree)是非常有用的”,但对其他人来讲,表达式树则是C# 3.0或VB 9.0的所有新特性中最引人注目的一个概念。

作者:Hartmut Wilms 来源:IT专家网 2008年5月24日

关键字: 表达 掌握 net Windows

  • 评论
  • 分享微博
  • 分享邮件
对于熟悉函数式编程语言的开发者而言,可能不需要再解释为什么说“表达式树(即Expression Tree)是非常有用的”,但对其他人来讲,表达式树则是C# 3.0或VB 9.0的所有新特性中最引人注目的一个概念。

  Charlie Calvert讲解了表达式树的基础,他从语法描述开始,并以同Visual Studio 2008一起发行的示例程序——ExpressionTressVisualizer为例,形象地展示了如何使用表达式树。

  表达式树与Lambda表达式相关联,Lambda表达式是可在行内实现预期代理和匿名代理的内容的一种方式。Ian Griffiths在他关于表达式树文章中,给出了一个非常不错的Lambda表达式介绍,以及Lambda与表达式树的关系。正如Ian所指出的,“Lambda除了语法不同以外,并没有比我已掌握的匿名方法提供更多的东西,但是,它却使一些匿名方法无法实现的事情变成了可能。”  

Func nonExprLambda = x => (x & 1) == 0;Expression> exprLambda = x => (x & 1) == 0;
  [...]
  第二行更有趣,它变成Func的代理,将Func作为一种名为Expression的泛型的类型参数,然后按照相同的方式进行初始化,因此,你可能会认为两者是在完成同样的事情,但是,它却能让编译器知道了Expression类型,这就导致了不一样的行为;前者会直接将Lambda表达式编译为IL,而后者则是通过对表达式进行评估后,生成一个可以创建并代表此表达式的对象树的IL。

  Charlie仔细钻研了Expression的细节:

  Expression类共有四个属性:

  Body:获取表达式的主体;

  Parameters:获取Lambda表达示的参数;

  NodeType:得到树中某些节点的表达式类型(ExpressionType),这是一个有45种不同值的枚举类型,代表表达式节点的所有可能类型,如返回常数、也可能返回参数、或者返回一个值是否小于另外一个(<),或者返回一个值是否大于另外一个(>),或者返回两个值的和(+)等等;

  Type:得到表达式的静态类型,在本例中,表达式的类型是Func

  在C# 3.0和VB 9.0大部分新特性中,表达式树在“LINQ,尤其是LINQ to SQL”中扮演了一个非常重要的角色:  

var query = from c in db.Customers where c.City == "Nantes" select new { c.City, c.CompanyName };
  LINQ表达式会返回一个IQueryable类型的值,IQueryable值包含有一个表达式树,由它来代表这个LINQ查询。当创建这个查询时,SQL语句并没有被发送到数据库中,只有当你在代码中对这个IQueryable对象进行Iterate操作时,这个SQL语句才会被创建并执行,这个概念就是延迟执行。

  Charlie Calvert对这种方法的使用进行了说明:

  因为查询是以一种高度抽象的数据结构封装后传送给编译器的,所以,编译器可以以它期望的任一方式自由地进行翻译。查询的执行次序和途径并非强制指定的,相反,它可以对表达树进行分析,以发现你所期望的结果,然后再决定如何处理;至少在理论上,它可以独立地考虑很多因素,诸如当前的网络流量、数据库的负载、它当前已有的可用结果集等等;虽然在LINQ to SQL中,它实际上并没有去考虑所有这些因素,但在理论上它可以考虑更多它关心的因素;此外,它还可以对表达式树进行分析,并将LINQ to SQL的输出结果转换成截然不同的形式,然后传递给你手写的自定义代码。

  Marlon Grech展示了如何应用表达式树,以及如何创建表达式解析器。Octavio Hernández提供了一个表达式树的表达式类层次汇总表。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章