升級建議:使用早期繫結和明確轉換

更新:2007 年 11 月

Visual Basic 6.0 和 Visual Basic 2008 都支援晚期繫結 (Late Bound) 物件,這是將變數宣告為 Object 資料型別,並在執行階段將它指定為類別 (Class) 之執行個體 (Instance) 的方式。但是,在升級程序中解析預設屬性 (Property)、或是基礎物件模型改變及屬性 (Property)、方法和事件必須進行轉換時,晚期繫結物件會造成一些問題。例如,假設您有個稱為 Form1 的表單,其中有個稱為 Label1 的標籤 (Label),下列 Visual Basic 6.0 程式碼會將此標籤的標題設定為 "SomeText":

Dim o As Object
Set o = Me.Label1
o.Caption = "SomeText"

在 Visual Basic 2008 中,標記控制項的 Caption 屬性已經由 Text 屬性取代。程式碼升級時,所有 Caption 屬性的執行個體都會變更為 Text,但因晚期繫結物件沒有型別,因此 Visual Basic 無法偵測出它的物件型別,或者是否應轉譯任何屬性。在這種情況下,您必須在升級後自行修改程式碼。

如果您將程式碼重新撰寫為使用早期繫結 (Early-Bound) 物件,就可以自動升級:

Dim o As Label
Set o = Me.Label1
o.Text = "SomeText"

其中您可能要宣告變數的適當物件型別,而不只是將其宣告為 Object 資料型別。

若您的確已在 Visual Basic 6.0 程式碼中使用 Object 和 Variant 變數,則建議您在指派變數、在變數上執行運算或將變數傳遞給函式時,使用明確轉換。例如,下列程式碼中的 '+' 運算的意圖是不明確的:

Dim Var1 As Variant
Dim Var2 As Variant
Dim Var3 As Variant
Var1 = "3"
Var2 = 4
'BAD: Should Var1 and Var2 be added as strings or integers?
Var3 = Var1 + Var2

上述範例在 Visual Basic 2008 中可能會造成執行階段錯誤。重新撰寫使用明確轉換的最後一行程式碼,以確保程式碼能夠運作:

'GOOD: explicit conversion
Var3 = CInt(Var1) + CInt(Var2)

Visual Basic 2008 會根據參數型別支援多載化 (Overloading) 函式。例如,目前 Environ 函式具有兩種形式:

Environ( Expression As Integer) As String
Environ( Expression As String ) As String

Visual Basic 2008 會根據參數型別判斷要呼叫哪一個函式。如果將整數傳遞給 Environ(),將呼叫整數版本。如果所傳遞的是字串 (String),則將呼叫字串版本。傳遞 Variant 或 Object 資料型別給多載函式的程式碼,可能會導致編譯器錯誤或執行階段錯誤。使用明確轉換 (如下列範例所示) 表示當程式碼升級為 Visual Basic 2008 之後,將可依照預期般地運作:

Dim a As String
Dim v As Variant
v = "Path"
'GOOD: explicit conversion
a = Environ(CStr(v))

對晚期繫結物件使用明確轉換是良好的程式設計方式。它能讓您更容易判斷程式碼的的用途,也能讓您輕鬆地將專案升級為 Visual Basic 2008。

請參閱

其他資源

語言升級的建議