您的位置:首页 > 编程语言 > C#

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: