Expression_Tree上手指南.docVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Expression_Tree上手指南

Expression Tree上手指南 (一) 大家可能都知道Expression Tree是.NET 3.5引入的新增功能。不少朋友们已经听说过这一特性,但还没来得及了解。看看博客园里的老赵等诸多牛人,将Expression Tree玩得眼花缭乱,是否常常觉得有点落伍了呢?其实Expression Tree是一个一点就透的特性,只要对其基本概念有了一定的了解,就可以自己发挥出无数的用法。特别是之前对Reflection,泛型等知识有过一些了解的话,就会发现Expression Tree的加入绝对是你工作中的得力助手。如果你是Expression Tree的新手,那么从本文开始,你就可以领略这一工具,之后再看老赵的文章就从容不迫了~ 从表达式说起 Expression Tree从名称上看就是“表达式树”的意思。许多人一看到它,就会想起Lambda表达式,委托,Linq等等一堆名词。但其实最基本的概念就是“表达式”。现在让我们把那些名词全都给忘了,来重新了解一下表达式。 表达式是当今编程语言中最重要的组成成分。简单的说,表达式就是变量、数值、运算符、函数组合起来,表示一定意义的式子。例如下面这些都是(C#)的表达式: 3 //常数表达式 a //变量或参数表达式 !a //一元逻辑非表达式 a + b //二元加法表达式 Math.Sin(a) //方法调用表达式 new StringBuilder() //new 表达式 此外还有取地址表达式,新建数组表达式,赋值表达式等许多种。如你所见,表达式常常能够表示一个值或对象,因此在C#这类强类型语言里,表达式常常有一个相应的类型。例如“3”这个表达式就是int类型的。不过有时表达式也没有值,例如方法调用表达式,如果方法没有返回值的话这个表达式也就没有值。这种情况我们也说表达式的类型是void。 表达式的一个重要的特点就是它可以无限地组合,只要符合正确的类型和语义。例如+可以用于各类数值类型的加法,那么加号的左右就可以是任何类型为相应数值的表达式。可以是函数调用和常数:Math.Sin(a) + 3;也可以是同样的加法表达式a + 2 + 3。想必大家在实践中早就用上这个特性了。那么a + 2 + 3是如何计算出正确的值来的呢?应该首先计算(a + 2)的结果b,然后计算b + 3的值。如果我们用一个图来表示这个过程,它就像这样: ? 同理,表达式Math.Sin(a) + 3也可以表示成这样: ? 如你所见,所有表达式都可以表示成这种树一样的结构。每个节点和它所有的后裔都构成一个独立的表达式。如果我们将表达式表示成这种结构,就可以轻易地明白它的运算规则和步骤。因此我们可以用一种树状的数据结构来表示每一个表达式。这个数据结构就是表达式树。 表达式树 刚才提到了,表达式树就是一种表示表达式的数据结构。System.Linq.Expression命名空间下的Expression类和它的诸多子类就是这一数据结构的实现。每个表达式都可以表示成Expression某个子类的实例。每个Expression子类都按照相应表达式的特点储存自己的子节点。例如BinaryExpression就表示各种二元运算符的表达式。它的Left和Right属性就是参与二元运算的两个运算数。下面开始我们将每种表达式的内部特定结构称作表达式的“成分”。比如二元运算表达式的成分就是左运算数表达式、右运算符表达式和一个运算符。 Expression各个子类的构造函数都是不公开的,要创建表达式树只能使用Expression类提供的静态方法。(这同时也说明表达式树体系是不能自己扩展的)如果我们要创建1 + 2 + 3这个表达式的表达式树,可以这样写: ConstantExpression exp1 = Expression.Constant(1); ConstantExpression exp2 = Expression.Constant(2); BinaryExpression exp12 = Expression.Add(exp1, exp2); ConstantExpression exp3 = Expression.Constant(3); BinaryExpression exp123 = Expression.Add(exp12, exp3); 这个应该非常好理解。下面如果我们想写出Math.Sin(a)这个表达式的表达式树怎么办呢?这时问题就来了,这里面的“a”不知道该用什么表示。为了解决这个问题,下面Lambda表达式该登场了。 Lambda表达式 Lambda也是C#3.0/VB9新引入的表达式。我们都知道它和以前的匿名函数和委托有关。不过现在还是把这些暂时都忘掉,完全把Lambda表达式当成一种新的

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档