在C#新增的功能中,其中一个很重要的就是对动态语言的支持,在.Net framework 4.0里C#可以和一些建立在CLR基础上的动态语言(譬如Iron Python)进行很方便的互操作。在语言层面,C#引进了新的关键字dynamic。
dynamic关键字用于声明一个动态对象,然后通过该动态对象去调用方法或读写属性。看下面一段代码:
可以看到方法GetSomeList()定义的返回类型是dynamic,上面例子里实际返回的类型是List。而事实上这里可以返回任何类型,无论int,string,StringBuilder都可以,因为已经定义了它的返回类型是“动态”的。
而myObject调用了它的方法NonExistsMethod,正如其名,这个方法在任何地方都是不存在的。但是上述程序可以在Visual Studio 2010里编译通过,没有任何错误。如果把NonExistsMethod替换成实际存在的方法,例如Sort(),运行也是没有问题的。也就是说,如果某个变量是dynamic类型的,那么编译器允许调用任何存在或者不存在的方法。这些方法会一直到运行时才再被绑定,如果不存在,当然就会有异常抛出。
由此可以看出,dynamic和object很像。一个dynamic类型的引用和object一样,可以指向任何类型。C#中,方法GetSomeList()就是这样的用法。但是两者又有点不同,例如可以调用任何方法,这样就增强了动态性。编译上述例子并在reflector里查看过后,会发现在C#编译上确实把它作为了object,GetSomeList()会被编译成:
而对dynamic对象的调用会被编译成:
由此可见,在dynamic背后,NonExistsMethod被处理成了动态绑定用的字符串。而一个新的类型System.Runtime.CompilerServices.CallSite被引入到.Net 4.0里用来支持这样的动态绑定。(www.xing528.com)
引入dynamic的意义如下。
1)可以和动态语言互操作,可以同时享受动态语言的灵活和.Net的强大
2)可以支持自顶而下的开发方式,从顶层的架构开始搭起会很容易,调用不存在的方法(甚至这个类都根本不存在)编译也没有问题。
注意
dynamic的引入可以使C#和动态语言一样,失去编译器的保护。尤其在对代码重构的时候,如果代码中存在对dynamic的滥用,将会造成巨大的麻烦。所以这件武器虽然强大,但同时也是一把双刃剑。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。