表达式树
Expression Tress 表示树状数据结构的代码
应该是不可变的,要修改某个表达式树,则必须通过复制现有的表达式树并替换其中的节点来构造一个新的表达式树
二叉树
Binary expression tree
树状结构的每个节点都是一个表达式
the expression tree is an inmemory data representation of the lambda expression ---msdn
优点:
1.可动态修改可执行代码
2.动态执行各个数据库中的LINQ查询
3.创建动态查询
4.表达式树还可在动态语言运行时DLR中用来提供动态语言和.NET Framework之间的互操作性
用法
1.匿名lambda表达式让编辑器创建表达式树
2.使用System.linq.expressions命名空间手动创建表达式树
3.Expression<TDelegate> : LambdaExpression
Expression类型创建表达式树
1.在system.linq.expressions命名空间中定义
2.若要使用Expresstion类创建表达式树,类静态工厂方法 ParameterExpression(表示一个变量或参数),MethodCallExpression(表示一个方法调用),ParameterExpression、MethodCallExpression这些类型派生自抽象类型Expression
在.net4.0中,表达式树API还支持赋值和控制流表达式(如循环、条件和try--catch块,可以使用expression更复杂的表达式树)
面试题:
匿名类型是什么
dynamic是什么
var是什么
他们的区别是什么
早绑定和晚绑定区别
晚绑定的实现方式有哪些?
早绑定:Early Binding
静态绑定:static Binding
迟绑定:Late binding ,别名 dynamic binding 动态绑定 ,在CLR去顶变量的类型
迟绑定的实现方式:
1.反射 动态创建类型实例
2.Dynamic 类型
早绑定 | 晚绑定 |
1.效率高 | 1.效率低 |
2.智能提示 | 2.无法提示 |
3.类型检查 | 3.无法检查 |
4.不能改变类型 | 4.可以改变类型 |
5.死板 | 5.灵活 |
C#4.0引入了dynamic,一种静态类型,但是会跳过类型检查
DLR 是 .NET4.0中的一个新API,目的是允许动态语言系统在.NET上运行,并为动态语言提供.NET互操作性
DLR 是一种运行时环境,将一组适用于动态语言的服务添加到CLR
动态语言(js,python,php等)可以在CLR标识对象的类型:
DLR提供了Dynamic类型的基础结构,还提供了诸如IronPython和IronRuby等动态编程语言的实现
DLR的代码可以从codeplex网站下载