C#-dynamic及动态绑定
2016-02-26 15:29
561 查看
dynamic
Visual C# 2010 引入了一个新类型 dynamic。该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查。大多数情况下,该对象就像具有类型 object 一样。在编译时,将假定类型化为 dynamic 的元素支持任何操作。因此,您不必考虑对象是从 COM API、从动态语言(例如 IronPython)、从 HTML 文档对象模型 (DOM)、从反射还是从程序中的其他位置获取自己的值。但是,如果代码无效,则在运行时会捕获到错误。在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查,改为在运行时解析这些操作。 dynamic 类型简化了对 COM API(例如 Office Automation API)、动态 API(例如 IronPython 库)和 HTML 文档对象模型 (DOM) 的访问。
动态绑定
C# 4.0之前的变量声明,在编译时已经决定其类型,虽然C# 3.0提供了var关键字来声明隐式类型,但用var声明的变量终究逃不过编译器的法眼。用dynamic声明变量的好处是,编译器在编译时并不知道它引用对象的确切类型,而要到运行时才知道。因此,我们可以通过动态绑定在运行时来操作一些类型的属性、方法等(如与IronPython,IronRuby,COM互操作),而这些在编译时编译器并不知情。dynamic d = GetSomeObject();
d.Foo();
此处代码在编译时,编译器并未将Foo()方法绑定到变量d, 而是延时到运行时才绑定。我们可以通过IL DASM查看,会发现,当有动态类型时,会交给DLR去处理。
静态绑定(Static Binding)VS动态绑定(Dynamic Binding)
C# 4.0之前,每当声明一个变量时,都有一个具体的类型与之对应。因为编译器在编译时会进行类型检查,一旦出现类型方法匹配失败,语言错误等编译器就会报错。请看下面的两行代码:SomeType st = …
st.DoSomething();
当编译器编译这段代码时,最简单的情况是编译器绑定SomeType类型的DoSomething无参方法。如果失败,则查找SomeType的DoSomething可选参数版本或SomeType基类方法。如果还失败,再查找SomeType的扩展方法版本。如果再失败,编译器就会报编译错误。我们可以看出,静态绑定是编译器基于可知类型之上的绑定。
现在,我们把st变为Object类型, 如下:
Object st = …
st.DoSomething();
编译时,我们也会得到一个编译错误,因为Object类型并没有DoSomething()方法。我们再修改代码如下:
dynamic st = …
st.DoSomething();
dynamic就是一个难以具体描述的对象,虽然你可以使用,但它却是在运行时基于它的运行时类型的绑定。因为它不是一个编译时类型,当编译器在编译时发现有动态类型,就把绑定交给运行时来做,即DLR。
相关文章推荐
- C#关于FTP上的文件操作
- C#关于数组Console.Write("{0,4:d}",c[i,j]);是什么意思
- .NET框架中的委托和事件
- C#下使用GDAL
- 委托C#(delegate、Action、Func、predicate,Predicate)
- C#札记
- C# 命名规范
- C#Winform程序如何发布并自动升级(图解)
- C# winform程序怎么打包成安装项目(图解)
- C#单例模式的三种写法
- 由StreamWriter.WriteLine 引发对C#多线程的深入思考(一)
- c#版三层登录
- C#学习笔记:foreach原理
- C#关键字:yield
- C# 值类型与引用类型 (上)
- C# .Net动态调用webService
- C#中方法、类等的默认访问修饰符~
- C#基础之结构体&枚举&数组
- C# 生成二维码并且在中间加Logo
- c#日期计算