C#4.0 动态绑定(Dynamic Binding)
来源:互联网 发布:linux运行我的世界效率 编辑:程序博客网 时间:2024/05/19 16:03
.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无参方法。如果失败,则查找SomeType的DoSomething可选参数版本或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接口的类型意味着对该类的实例的操作都会在运行时进行。如下面代码所示:- C#4.0 动态绑定(Dynamic Binding)
- java 动态绑定 dynamic binding
- C++ 动态绑定Dynamic binding
- 静态绑定(static-binding) 动态绑定(dynamic-binding)
- 2. objC 动态绑定(dynamic binding)
- 如何理解C++中的动态绑定(dynamic binding)
- 如何理解C++中的动态绑定(dynamic binding)
- 多态和动态绑定(polymorphism and dynamic binding)
- dynamic region binding task flow(region 动态绑定流taskflow)
- C++ - 继承(inheritance) 和 动态绑定(dynamic binding) 简介
- 虚函数与动态绑定 / Virtual function and Dynamic Binding
- Java中的多态(polymorphism)和动态绑定(dynamic binding)
- java中转型(upcasting)与动态绑定(dynamic binding)或者后期(late binding)细节
- java中转型(upcasting)与动态绑定(dynamic binding)或者后期(late binding)细节
- 虚函数(virtual)与多态(polymorphism)、动态绑定(dynamic binding)
- 【Java Learning】重载、多态和动态绑定——Overloading、Ploymorphism&Dynamic binding
- Dynamic Binding
- C#-dynamic及动态绑定
- 电池里mAh和Wh有什么区别?
- Oracle 表连接方式(内连接/外连接/自连接) 详解
- csdn首页体验
- 三角形类2
- Linux 目录权限小结
- C#4.0 动态绑定(Dynamic Binding)
- 资料网站
- 使用 Eclipse+Axis2 构建 Web Service 应用(客户端无需生成 Stub 方式)
- ZOJ 3693 Happy Great BG(进位问题)
- 程序员面试笔试知识点总结1
- 三角形类3
- JAVASE----11----Map集合
- 自主操作系统LMOS-00.04发布啦
- Android模拟器AVD接收电脑键盘和模拟器物理按键输入