早期绑定、动态绑定、后期绑定(转自:http://www.cnblogs.com/chengchen/archive/2008/06/15/1222534.html)
2010-10-20 11:40
459 查看
这里所说的绑定并不是指对一个控件的数据绑定。这种绑定是指与类之间建立某种联系的过程,比如在CMD程序中要调用另外一个程序集中的类的方法:
在ConsoleApplication程序中:
using
System;
using
System.Collections.Generic;
using
System.Text;
using
ClassLibrary1;
namespace
ConsoleApplication1
{
class
Program
{
static
void
Main(
string
[] args)
{
Class1 cls
=
new
Class1();
Console.Write(cls.Hello());
}
}
}
在Class1.Dll文件中
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
ClassLibrary1
{
public
class
Class1
{
public
string
Hello()
{
return
"
Hello world
"
;
}
}
}
首先我们在CMD程序中引用了Class1然后对其进行实例化,最后再调用了Class1 的Hello() 方法。经过编译器编译后,这样的一个过程就已经写在程序集合里面了,像这种关系的建立叫做“早期绑定”。
相反,在Class1调用Class2 的方法时候并没有引用Class2那么这个过程就是“后期绑定”了。也就是说Class2对于Class1是完全未知的情况下被调用的。针对上面的程序我们这样修改:
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Reflection;
using
System.Windows.Forms;
namespace
ConsoleApplication2
{
class
Program
{
static
void
Main(
string
[] args)
{
Assembly assembly
=
Assembly.LoadFile(Application.StartupPath
+
"
//ClassLibrary1.dll
"
);
Type type
=
assembly.GetType(
"
ClassLibrary1.Class1
"
);
MethodInfo methodInfo
=
type.GetMethod(
"
Hello
"
);
object
obj
=
assembly.CreateInstance(
"
ClassLibrary1.Class1
"
);
Console.WriteLine(methodInfo.Invoke(obj,
null
));
}
}
}
“动态绑定”则是指建立了部分联系,一般是在虚方法或抽象方法调用时,多态机制会在执行期间根据实际对象来确定要执行的代码。
其实这里的绑定的定义并不是C#最先提出的,早在VB6.0时代,就有“早期绑定”和“后期绑定”之分,只不过在VB6.0中的定义要狭隘的多:只有当变
量被定义为Object 或 Variant
类型时候才属于“后期绑定”。同样很容易发现在解释执行的语言中没有“早期绑定”,而C#提供的“后期绑定”研究意味着使用C#开发一门解释型的语言也是
很easy的。
最后我们来看看这两者分别用在什么地方。就大多数程序来说,一般都应该使用“早期绑定”,因为很显然它的性能要高一些。而“后期绑定”应该用在特殊的地
方,比如在程序中可以调用插件,这必然是需要“后期绑定”的。在破解上“反射注册机”的编写也需要“后期绑定”,编写解释性语言也需要“后期绑定”。因此
可见“后期绑定”在对程序集的处理上更加的灵活。
在ConsoleApplication程序中:
using
System;
using
System.Collections.Generic;
using
System.Text;
using
ClassLibrary1;
namespace
ConsoleApplication1
{
class
Program
{
static
void
Main(
string
[] args)
{
Class1 cls
=
new
Class1();
Console.Write(cls.Hello());
}
}
}
在Class1.Dll文件中
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
ClassLibrary1
{
public
class
Class1
{
public
string
Hello()
{
return
"
Hello world
"
;
}
}
}
首先我们在CMD程序中引用了Class1然后对其进行实例化,最后再调用了Class1 的Hello() 方法。经过编译器编译后,这样的一个过程就已经写在程序集合里面了,像这种关系的建立叫做“早期绑定”。
相反,在Class1调用Class2 的方法时候并没有引用Class2那么这个过程就是“后期绑定”了。也就是说Class2对于Class1是完全未知的情况下被调用的。针对上面的程序我们这样修改:
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Reflection;
using
System.Windows.Forms;
namespace
ConsoleApplication2
{
class
Program
{
static
void
Main(
string
[] args)
{
Assembly assembly
=
Assembly.LoadFile(Application.StartupPath
+
"
//ClassLibrary1.dll
"
);
Type type
=
assembly.GetType(
"
ClassLibrary1.Class1
"
);
MethodInfo methodInfo
=
type.GetMethod(
"
Hello
"
);
object
obj
=
assembly.CreateInstance(
"
ClassLibrary1.Class1
"
);
Console.WriteLine(methodInfo.Invoke(obj,
null
));
}
}
}
“动态绑定”则是指建立了部分联系,一般是在虚方法或抽象方法调用时,多态机制会在执行期间根据实际对象来确定要执行的代码。
其实这里的绑定的定义并不是C#最先提出的,早在VB6.0时代,就有“早期绑定”和“后期绑定”之分,只不过在VB6.0中的定义要狭隘的多:只有当变
量被定义为Object 或 Variant
类型时候才属于“后期绑定”。同样很容易发现在解释执行的语言中没有“早期绑定”,而C#提供的“后期绑定”研究意味着使用C#开发一门解释型的语言也是
很easy的。
最后我们来看看这两者分别用在什么地方。就大多数程序来说,一般都应该使用“早期绑定”,因为很显然它的性能要高一些。而“后期绑定”应该用在特殊的地
方,比如在程序中可以调用插件,这必然是需要“后期绑定”的。在破解上“反射注册机”的编写也需要“后期绑定”,编写解释性语言也需要“后期绑定”。因此
可见“后期绑定”在对程序集的处理上更加的灵活。
相关文章推荐
- Windows phone 应用开发[12]-Pex 构建自动化白盒测试[下] 转:http://www.cnblogs.com/chenkai/archive/2012/01/29/2331263.html
- 在Silverlight中对多个异步任务的调用 http://www.cnblogs.com/chenxizhang/archive/2011/08/30/2159124.html
- http://www.cnblogs.com/macro-cheng/archive/2011/09/30/android-001.html
- 存储过程使用事物的几种方式 转载自--http://www.cnblogs.com/chengxiaoming/archive/2010/06/11/1756163.html
- Windows Phone 7 MVVM模式数据绑定和传递参数 from:http://www.cnblogs.com/linzheng/archive/2011/03/27/1997086.html
- ACM基本输入输出(转自http://www.cnblogs.com/chenqiangjsj/archive/2011/04/08/2009452.html)
- 爬虫基础学习 转【http://www.cnblogs.com/huangxincheng/archive/2012/11/08/2759752.html】
- http://www.cnblogs.com/amylis_chen/archive/2010/07/15/1778217.html
- Javascript中的陷阱大集合【译】(转自:http://www.cnblogs.com/sxwgf/archive/2011/11/14/javascript-gotchas.html)
- mysql的字符串函数 http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/12/13/1904330.html 对于针对字符串位置的操作,
- java反射详解-原文地址:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
- zz from http://www.cnblogs.com/harrychinese/archive/2011/03/13/some_hadoop_hive_intro_articles.html
- Visual Studio2010+SOS.dll调试入门 摘自 http://www.cnblogs.com/luminji/archive/2011/01/27/1946217.html
- http://www.cnblogs.com/mchina/archive/2012/09/07/2651568.html
- Php魔术方法(http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/22/2185034.html)
- .NET2005文档自动生成-http://www.cnblogs.com/3echo/archive/2007/10/18/929648.html
- http://www.cnblogs.com/starspace/archive/2008/10/13/1310175.html
- http://www.cnblogs.com/peida/archive/2012/12/19/2824418.html
- http://www.cnblogs.com/Bear-Study-Hard/archive/2008/03/26/1123267.html
- http://www.cnblogs.com/yungboy/archive/2010/05/27/1745268.html