一、表达树理解
表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,它将我们原来可以直接由代码编写的逻辑以表达式的方式存储在树状的结构里,从而可以在运行时去解析这个树,然后执行,实现动态的编辑和执行代码。在.Net 里面的Linq to SQL就是对表达式树的解析。
这里先讲解下表达式和表达式树,表达式相信大家都知道,比如x+5或者5,都可以算是表达式,而表达式树里面的树指的二叉树,也就是表达式的集合,C#中的Expression类就是表达式类。对于一棵表达式树,其叶子节点都是参数或者常数,非叶子节点都是运算符或者控制符。
从概念上来说表达式树提供了一种树型的逻辑描述机制,
表达式树这种树形的逻辑结构及其提供的运行时编译功能使系统有了很大的灵活性。
打个比方在EF中的IQueryable 内部就是通过表达式树来进行后期生成Sql的,
![](https://img-blog.csdnimg.cn/img_convert/2e7d1ac772792ad60ba5f18fb2d7036b.png)
![](https://img-blog.csdnimg.cn/img_convert/9dd3f59c63d878e304119d6881618f8c.png)
总结来看表达式树在运行时提供了一种描述逻辑->延迟编译->延迟执行的行为,可以提供很好的解偶效果,同时如果编译成委托的话在运行时会比反射有更好的性能。
缺点由于这种运行时编译的效果所以我们很难进行debug,同时很难进行问题分析。