C#4.0 动态绑定(Dynamic Binding)

来源:互联网 发布:linux运行我的世界效率 编辑:程序博客网 时间:2024/05/19 16:03
<!--[endif]-->

  .NET 4.0引入了一个新概念,叫动态绑定。所谓绑定,就是对类型、成员和操作的解析过程。动态绑定意味着与编译器无关,而与运行时有关。

<!--[endif]--> 

一、   基本概念

<!--[endif]--> 

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无参方法。如果失败,则查找SomeTypeDoSomething可选参数版本或SomeType基类方法。如果还失败,再查找SomeType的扩展方法版本。如果再失败,编译器就会报编译错误。我们可以看出,静态绑定是编译器基于可知类型之上的绑定。

现在,我们把st变为Object类型,如下:

Object st = ...

st.DoSomething();

编译时,我们也会得到一个编译错误,因为Object类型并没有DoSomething()方法。我们再修改代码如下:

dynamic st = ...

st.DoSomething();

dynamic就是一个难以具体描述的对象,虽然你可以使用,但它却是在运行时基于它的运行时类型的绑定。因为它不是一个编译时类型,当编译器在编译时发现有动态类型,就把绑定交给运行时来做,即DLR

三、   自定义绑定(Custom Binding) VS语言绑定(Language Binding)

自定义绑定发生在所有实现了System.Dynamic.IDynamicMetaObjectProvider接口的类型上。因为在C# 4.0的动态类型世界里,实现了System.Dynamic.IDynamicMetaObjectProvider接口的类型意味着对该类的实例的操作都会在运行时进行。如下面代码所示:

代码
原创粉丝点击