top
Loading...
從VisualBasic6.0到VisualBasic.NET的轉換(3)
升級
向導


過程的 ParamArray 參數標記有升級警告。例如,以下代碼:

Function MyFunction(ParamArray p() As Variant)
'...
End Function
升級后將變為:

' UPGRADE_WARNING: ParamArray p was changed from ByRef to ByVal
Function MyFunction(ByVal ParamArray p() As Object)
'...
End Function


聲明中的 As Any 參數
Visual
Basic 6.0 本地 API 的參數可以聲明為 As Any,這樣對本地 API 的調用就可以傳遞任何數據類型。通過這一方法,可以調用參數支持兩種或多種數據類型的 API。

Visual Basic.NET


重載的 Declare 語句可以定義為允許調用帶有兩種或多種數據類型的本地 API。例如,以下 Declare 語句:

Private Declare Function GetPrivateProfileString _
Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
可以由兩個 Declare 版本代替,一個接受 Long,一個接受字符串。

Overloads Private Declare Function GetPrivateProfileStringKey _
Lib "kernel32" Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As String, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
Overloads Private Declare Function GetPrivateProfileStringNullKey _
Lib "kernel32" Alias"GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As Long, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String) As Long
這提高了類型的安全性,并減少了導致程序失敗的小毛病。這一情況的存在是因為編譯器不允許通過沒有顯式定義的數據類型來調用 API。

升級
向導


使用 As Any 參數的 Declare 語句標記有升級警告。


Implements
Visual
Basic 6.0 Implements 語句指定在其出現的類模塊中實現的接口或類。

Visual Basic.NET


Visual Basic.NET 中的 Implements 與 Visual Basic 6.0 中的 Implements 有兩個本質區別:

在 Implements 語句中不能指定類。
每一種實現方法均要求在方法聲明語句的結束處使用 Implements 子句。該子句指定其實現的接口方法。
由于要求每一種實現接口方法的方法均使用 Implements 子句,所以提高了代碼的可讀性;在閱讀使用方法來實現接口方法的的代碼時,這一優點顯而易見。

升級
向導


如果類 a 實現類 b,則將為類 b 聲明接口,且類 a 將變為實現類 b 的接口:

Interface _b
Function MyFunction() As String
End Interface
Class a
Implements _b
Function b_MyFunction() As String Implements _b.MyFunction
End Function
End Class


屬性
Visual
Basic 6.0 在 Visual Basic 6.0 中,特定屬性的 Get、Let 和 Set 屬性函數可以通過不同級別的訪問選項聲明。例如,Property Get 函數可以聲明為 Public 而 Property Let 可以聲明為 Friend。

Visual Basic.NET


屬性的 Get 和 Set 函數必須具有相同級別的訪問選項。這樣就便于 Visual Basic.NET 與其他 .NET 語言協同操作。

升級
向導


如果訪問選項的級別不同,則新屬性為 Public。


默認屬性
Visual
Basic 6.0 任何成員均可標記為類的默認值。

Visual Basic.NET


只有接受參數的屬性可以標記為默認值。對于將成為集合中的索引的帶參數屬性,這一情況很常見。

這使得代碼的可讀性更強,因為對沒有成員的對象變量的引用通常指向對象自身,而不是指向上下文中的對象和其他上下文中的默認屬性。例如,語句 Call Display(TextBox1) 可能是將文本框實例傳遞給 Display 函數,也可能是傳遞文本框的內容。

此外,刪除這種二義性避免了使用單獨的語句執行引用賦值。賦值 x = y 總是意味著將變量 y 的內容賦值給變量 x,而不是將 y 引用的對象的默認屬性賦值給 x 引用的對象的默認屬性。

升級
向導


盡可能解析默認屬性。無法解析時(延遲綁定對象)將添加錯誤注釋。


枚舉
Visual
Basic 6.0 枚舉常數可以無限定地被引用。

Visual Basic.NET


如果在文件或項目級別為枚舉添加了 Import,則枚舉常數可以無限定引用。

這樣可以與類、結構和接口保持一致,在類、結構和接口中,可以給成員賦予通用名稱,而不必擔心與其他成員沖突。例如,Color 枚舉和 Fruit 枚舉均可以包含名稱為 Orange 的常數。在 Visual Basic 6.0 中的規則是,為枚舉常數加上前綴使每個常數保持唯一。這使常數名稱非常累贅,如 MsColorOrange 和 MsFruitOrange。

升級
向導


對枚舉的引用將變為完全限定。


While
Visual
Basic 6.0 While 語句以 WEnd 語句結束。

Visual Basic.NET


為了與其他塊結構保持一致,While 的結束語句變為 End While。這提高了語言的一致性和可讀性。

升級
向導


將 WEnd 語句變為 End While。


On...GoTo 和 On...GoSub
Visual
Basic 6.0 根據表達式的值,On expression GoTo destinationlist 和 On expression GoSub destinationlist 語句使程序轉向目標列表中的若干個指定行之一。

Visual Basic.NET


On...GoTo 和 On...GoSub 是非結構化的編程構造。它們的使用讓程序更加難以閱讀和理解。Select Case 可以提供一種更加結構化和靈活的方法來執行多個分支。

注意:仍然支持 On Error GoTo。

升級
向導


以下示例:

On MyVariable GoTo 100,200,300
將標記有升級錯誤:

' UPGRADE_ISSUE On MyVariable GoTo was not upgraded
On MyVariable GoTo 100,200,300
您應當重寫代碼以避免使用這樣的語句,例如:

On x Goto 100,200,300
可以重寫為:

Select Case x
Case 1: '插入第 100 行的代碼
Case 2: '插入第 200 行的代碼
Case 3: '插入第 300 行的代碼
End Select


GoSub...Return
Visual
Basic 6.0 GoSub line...Return 語句在過程中分支到子例程,然后從子例程返回。

Visual Basic.NET


GoSub...Return 是非結構化編程構造。它的使用讓程序更加難以閱讀和理解。一個更加結構化的替代方案是:創建可以調用的獨立過程。

升級
向導


與 On...GoTo 相同,這些語句均標記有升級錯誤。


LSet
Visual
Basic 6.0 LSet 用空格填充字符串使其為指定長度,或者將用戶定義類型的變量復制到另一個用戶定義類型的變量。

Visual Basic.NET


不支持 LSet 語句。LSet 對類型而言很不安全,因此會在運行時導致錯誤。此外,由于它對類型而言不安全,因此執行時代碼必須完全可靠。刪除 LSet 語句后無法將一個結構復制到另一個結構;但是,可以修改 Visual Basic.NET 代碼,使用 RtlCopyMemory 來獲得相同的效果。

升級
向導


語句:

LSet a1 = a2
將標記有升級錯誤

' UPGRADE_ISSUE: LSet cannot assign a UDT from one type to another
LSet a1 = a2


VarPtr、StrPtr 和 ObjPtr
Visual
Basic 6.0 VarPtr、StrPtr 和 ObjPtr 以整數形式返回變量的地址,然后將此地址傳遞到使用地址的 API 函數(例如 RtlCopyMemory)。VarPtr 返回變量的地址,StrPtr 返回字符串的地址,ObjPtr 返回對象的地址。這些函數均未記錄在文檔中。

Visual Basic.NET


可以檢索數據項的地址,但是檢索必須通過調用 CLR 才能進行。這是因為 CLR 通常可以在內存中自由移動項目,因此需要讓 CLR 知道何時在使用地址,不能移動項目。以下示例檢索對象的地址:

Dim MyGCHandle As GCHandle = GCHandle.Alloc(o,GCHandleType.Pinned)
Dim Address As Integer = CInt(MyGCHandle.AddrOfPinnedObject())
'...
MyGCHandle.Free() '再次允許移動對象實例
允許運行時移動數據項目能夠改善運行時的性能。

北斗有巢氏 有巢氏北斗