一、前言
dynamic是.NET4.0引入的新类型(静态类型),在编译器中会跳过编译阶段的静态类型(类、int、string、bool、委托等)检查,让dynamic定义类型具备object对象一样的能力。在编译阶段对于dynamic定义的对象假定支持任何操作,在代码运行阶段进行检查、绑定、执行,所以如果检测出代码无效则会在运行时捕获异常信息。
C#是静态语言,提供的是类型安全操作,在编译阶段会对类型进行严格的检查,要求类型符合定义的操作。对于什么是静态语言和动态语言,静态语言(强类型语言)是在编译时变量要明确类型的语言,要求变量使用之前必须声明数据类型如JAVA/C++/C#等;动态语言(弱类型语言)时在运行时确定数据的类型,变量使用之前不需要类型声明如Python/PHP/JS/Ruby等。所以对C#引入动态语言dynamic类型总结一下。
二、内容
动态语言运行时在平台中功能
1、引入动态语言,C#就是动态语言?C#一直就是静态语言,引入动态语言(dynamic)并没有改变其语言类型,只是引入动态语言的特性,使得C#在一定程度上支持动态语言的使用。因为动态语言特有的灵活性,在一些编程的场景中减少代码量和复杂度、减少类型转换,以一种特性看待其作用,如果不使用动态语言则要通过object和反射的机制来是实现。
2、如何在C#静态语言中实现这个动态特性?.NET4.0引入了动态语言运行时(DLR),在.NET中是公共语言运行时(CLR),在这个运行时上引入DLR接口(API)来支持动态类型。在代码编译阶段依据关键字,创建的动态类型编译器会跳过类型检查(无法提供智能提示),因为其不属于CLR类型。动态语言运行时提供C#编译器对动态语言动态执行的代码库,它不具备JIT、垃圾回收等功能,通过DLR提供的绑定器(binder)和调用点(callsite)、元对象把动态代码转换成表达树,然后把表达式树编译为IL(中间语言)代码,最后CLR编译为本地代码执行。总结一句话就是通过动态语言运行时(DLR)帮助C#编译器识别动态语言类型,在运行时使用特定方式转换成IL,编译本地代码,执行代码。
3、C#中动态语言有那些局限性?C#是静态语言,本身是不支持动态类型,使用特性的方式让其支持就产生一定局限,比如不能作为参数的扩展方法;委托和动态类型不能隐式转换;动态类型不能调用构造函数和静态方法;动态类型不能作为泛型参数的约束。
4、如何使类型具备动态的行为?使用ExpandObject、使用DynamicObject、实现IDynamicMetaObjectProvider接口;如下代码所示:
三、总结
dynamic是特性的形式在静态语言中实现动态的行为,虽然其具备灵活性的特点,但是在明确的类型中还是使用静态类型,减少性能的损失。除非在特点的场景中动态语言带来减少代码量和复杂度、减少类型转换、针对无法确定类型。这就是代码实现的权衡问题了。
请发表评论