net里的表达式树其实是一种挺高级的东西

.NET里的表达式树其实是一种挺高级的东西,它是把代码逻辑转成树状结构的数据结构。你用的Expression、Expressions、Tree这些东西就属于这个范畴,通常放在System.Linq.Expressions这个命名空间里。 它跟直接写代码的最大区别在于,它不是直接执行的,而是留着让程序去分析、改或者转的。比如说LINQ和像Entity Framework这样的ORM框架特别喜欢用这个东西。当你写了一个Lambda表达式,框架会把它变成一棵表达式树,然后解析一下,最后弄成数据库能看懂的SQL语句发过去。 这个和委托也不太一样。委托就是个方法的引用,直接拿来用就能跑。而表达式树更多是用来分析逻辑的。比如同一个Lambda表达式,既可以编译成委托执行,也能转成树来看。 追问一下为什么ORM要用到这个呢?那是因为ORM要把我们写的查询逻辑转成数据库能听懂的SQL。如果直接用委托执行的话,代码跑了就没了,ORM根本不知道你到底想干啥。但要是有了表达式树,这个逻辑就被存成了一个可分析的对象结构。ORM就能顺着这棵树去看看你访问了哪些字段、用了啥条件判断或者逻辑运算,再把这些东西变成对应的SQL语句发过去。这样开发者写起来方便(都是强类型的C#代码),而且框架在运行时还能动态生成SQL,提高效率还少出错。 还有就是表达式树相比普通代码有啥优势?最大的优点就是能分析和动态改。因为它本来就是对象结构嘛,所以程序能在运行时去遍历、修改或者把它们组合起来。比如你想动态建个查询条件、搞个动态过滤逻辑或者弄个复杂的表达式树都没问题。另外它还支持动态代码生成和运行时编译。比如你根据业务需要弄好一棵表达式树,再把它编译成可执行的委托来用。这种技术在动态查询、规则引擎、ORM映射或者是动态代码生成这些场景里特别有用。