對VB6的后期綁定和前期綁定的一點看法

發表于:2007-05-25來源:作者:點擊數: 標簽:后期VB6定的一點看法
1. 什么是后期綁定和前期綁定后期綁定 MSDN 6的定義如下: 后期綁定:若將一個變量聲明為 As Object 或 As Variant(包括 As Form 或 As Control 的變量),Visual Basic 在編譯時就無法確定該變量將引用哪種類型的對象。因此,Visual Basic 必須使用后期綁
 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。

  當顯式聲明了變量的類時,例如 As Widget,該變量就只能存放該類的對象的引用。Visual Basic 就可以為該變量調用的所有屬性和方法使用前期綁定。

  建議在 Visual Basic 和應用程序中使用這種方法來聲明對象變量。

  使用前期綁定還是后期綁定完全取決于聲明變量的方式。對象的創建方式對此沒有任何影響。

  2. 后期綁定的幾個優勢和好處

  第一,個人認為,由于VB6不支持實現繼承,對于某些設計,可以使用將對象定義為Variant變量,而獲取某些設計和編碼上的便利,而得到接口或抽象類的好處。例如:

  如定義2個類:

clearcase/" target="_blank" >cccccc" width="90%" align="center" bgcolor="#e3e3e3" border="1">
Class1:

1Option Explicit
2
3Public Sub Update()
4 MsgBox "Class1 Updated"
5End Sub

Class2:

1Option Explicit
2
3Public Sub Update()
4 MsgBox "Class2 Updated"
5End Sub


  在使用的時候,可以使用以下方法,而實現一些設計模式:

1Dim objTest As Variant
2
3Dim objC1 As New Class1
4Set objTest = objC1
5objTest.Update
6
7Dim objC2 As New Class2
8Set objTest = objC2
9objC2.Test
10

  這樣,無須繼承機制,也可以得到抽象接口的優勢,而使接口、實現分離。

  第二,在調用外部的COM自動化組件時,如Office,如果通過這種方式調用,對于不同版本的Office,如果你調用的方法、屬性都是存在的,那么可以適應不同版本的Office,但如果通過前期綁定,在項目引用中確定對象類型,是有版本兼容問題的。

  3. 效率和劣勢

  其實最主要的劣勢是效率問題,《Advanced Visual Basic 6》一書說,使用Variant變量和Long變量進行循環,效率差別是1.5倍,而沒有別人認為的那么大,而且對于大對象,差別也不是很大。對于本文前邊的例子,如果創建的是進程內對象,前期綁定和后期綁定調用效率差別大概2:3左右,也就是說也是1.5倍。對于調用Office這樣的外部COM自動化對象,也許差別大一些,沒有專門測試,不過對于Office自動化,速度主要是決定于Office本身的啟動、初始化。

  另外一個劣勢是沒有了IDE下的屬性、方法成員自動列出。

  所以,個人認為,在使用VB6的時候,為了得到好的設計,有時不妨使用一些VB6的后期綁定的特性,來提高設計質量。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97