前期绑定和后期绑定

以vb为例

后期绑定:

  将对象分配给一个声明为objcet类型的变量,若将一个变量声明为variant or ojbect ,(包含as form,as control变量),vb编译时就无法确定该变量讲引用那种类型的对象,应用程序只能在运行时确定对象的属性和方法。

  使用后期绑定,每次调用属性或者方法时,vb都将成员名传给该对象IDispatch接口的方法-GetIDsOfNames方法,GetIDsOfNames返回 该成员的id或者DispId,vb程序再将DispID传给IDispathch接口的Invoke方法来调用该成员。

  对于进程外部件而言,这就意味着一次‘额外跨进程调用,调用开销增大。

  (idispatch接口:IDispatch接口把所有成员函数的入口地址放入到一个数组中,并且内部组织了一个Map,将数组索引和方法名称一一影射,DispId(COM 事件或者函数的调度 ID)就是这些方法在数组中的索引。通过DispId可以找到该方法的地址,调用该方法。

前期绑定:

  vb在编译时就知道属性或者方法所在对象。

  前期帮定预先知道函数成员在类型中的DispID,不需要调用GetIDsOfNames方法。而且早期绑定允许程序在编译时分配内存,或者进行其他优化,从而生成更高效的应用程序。

 比较:

  可见,前期绑定的效率高于后期绑定的效率,在进程内创建对象,据说速度比例是2:3,也就是说1.5倍,本文没有实际计算。而且前期绑定,在集成开发环境下,方法成员会自动显示。前期绑定会减少运行时的错误。但前期帮定时,在vb下需要引用该dll,如果被引用的组件不存在,整个引用程序也不能运行,如果是后期绑定,只要在创建对象createobect时才会抛错。前期帮定时,如果被引用组件版本不同,可能会有兼容性问题,但是如果是后期绑定,则没有问题。

 

例如:

定义工程1中定义类clstry

方法:

Public Function showMessage() As String
    showMessage = "this is result"
End Function

1 引用工程

Dim str As New ClsTry
    MsgBox str.showMessage

2 不引用工程

Dim str As Object
    Set str = CreateObject("vbpTry.ClsTry")
    MsgBox str.showMessage

posted @ 2011-11-18 14:16  银杏叶儿  Views(1100)  Comments(0Edit  收藏  举报