对VB6的后期绑定和前期绑定的一点看法
1.什么是后期绑定以及早期绑定和后期绑定?
MSDN协议6定义如下:
后期绑定:如果变量被声明为As Object或As Variant(包括As Form或As Control的变量),Visual Basic无法确定该变量在编译时将引用哪种类型的对象。因此,Visual Basic必须使用后期绑定来确定对象的属性和方法是否可以在运行时使用此变量。
如果使用后期绑定,则每次调用属性或方法时,Visual Basic都会将成员名称传递给对象的IDispatch接口的GetIDsOfNames方法。GetIDsOfNames返回该成员的调度ID或DispID。然后,Visual Basic将DispID传递给IDispatch接口的Invoke方法来调用该成员。
对于进程外组件,这意味着额外的跨进程方法调用,导致双重调用开销。
预绑定:如果Visual Basic可以在编译时知道属性或方法所属的对象,它就可以提前在类型库中查找成员的DispID或vtable地址。这消除了在运行时调用GetIDsOfNames的需要。
当变量的类被显式声明时,比如作为Widget,该变量只能保存该类的对象的引用。Visual Basic可以对该变量调用的所有属性和方法使用预绑定。
建议使用此方法在Visual Basic和应用程序中声明对象变量。
使用预绑定还是后绑定完全取决于变量的声明方式。对象的创建方式对此没有影响。
2.后期绑定的几个优点和好处
第一,我个人认为,由于VB6不支持继承的实现,所以对于一些设计来说,我们可以使用对象的定义作为Variant变量来获得一些设计和编码上的便利,获得接口或者抽象类的好处。例如:
例如,定义两个类:
类别1:
1 option Explicit
2
3 public Sub Update()
4 MsgBox " class 1 Updated "
5 end Sub
类别2:
1 option Explicit
2
3 public Sub Update()
4 MsgBox " class 2 Updated "
5 end Sub
在使用时,您可以使用以下方法来实现一些设计模式:
1 dim obj test As Variant
2
3 dim obj C1 As New class 1
4 set obj test = obj C1
5 object test。更新
6
7Dim objC2为新类别2
8 set objTest = objc 2
9 objc 2。测试
10
这样就可以在没有继承机制的情况下获得抽象接口的优势,实现接口和实现的分离。
其次,在调用外部COM自动化组件时,比如Office,如果这样调用,如果调用的方法和属性存在,可以适应不同版本的Office。但是,如果通过早期绑定来确定项目引用中的对象类型,则存在版本兼容性问题。
3.效率和缺点
其实主要缺点是效率。《高级Visual Basic 6》这本书上说,用Variant变量和Long变量循环的时候,效率相差1.5倍,没有别人想象的那么大,对于大型对象来说,差别也不是很大。对于本文前面的例子,如果创建一个进程内对象,早期绑定和后期绑定的调用效率差大约是2:3,也就是1.5倍。对于调用像Office这样的外部COM自动化对象,可能会有很大的区别,没有专门的测试。但是对于办公自动化来说,速度主要取决于Office本身的启动和初始化。
另一个缺点是IDE下没有属性和方法成员的自动列表。
所以我个人认为在使用VB6的时候,为了得到一个好的设计,有时候利用VB6的一些后期绑定特性来提高设计质量是可取的。
位律师回复
0条评论