直播中
向?qū)?/P>
過程的 ParamArray 參數(shù)標(biāo)記有升級警告。例如,以下代碼:
Function MyFunction(ParamArray p() As Variant)
'...
End Function
升級后將變?yōu)椋?/P>
' UPGRADE_WARNING: ParamArray p was changed from ByRef to ByVal
Function MyFunction(ByVal ParamArray p() As Object)
'...
End Function
聲明中的 As Any 參數(shù)
Visual
Basic 6.0 本地 API 的參數(shù)可以聲明為 As Any,這樣對本地 API 的調(diào)用就可以傳遞任何數(shù)據(jù)類型。通過這一方法,可以調(diào)用參數(shù)支持兩種或多種數(shù)據(jù)類型的 API。
Visual Basic.NET
重載的 Declare 語句可以定義為允許調(diào)用帶有兩種或多種數(shù)據(jù)類型的本地 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
這提高了類型的安全性,并減少了導(dǎo)致程序失敗的小毛病。這一情況的存在是因為編譯器不允許通過沒有顯式定義的數(shù)據(jù)類型來調(diào)用 API。
升級
向?qū)?/P>
使用 As Any 參數(shù)的 Declare 語句標(biāo)記有升級警告。
Implements
Visual
Basic 6.0 Implements 語句指定在其出現(xiàn)的類模塊中實現(xiàn)的接口或類。
Visual Basic.NET
Visual Basic.NET 中的 Implements 與 Visual Basic 6.0 中的 Implements 有兩個本質(zhì)區(qū)別:
在 Implements 語句中不能指定類。
每一種實現(xiàn)方法均要求在方法聲明語句的結(jié)束處使用 Implements 子句。該子句指定其實現(xiàn)的接口方法。
由于要求每一種實現(xiàn)接口方法的方法均使用 Implements 子句,所以提高了代碼的可讀性;在閱讀使用方法來實現(xiàn)接口方法的的代碼時,這一優(yōu)點顯而易見。
升級
向?qū)?/P>
如果類 a 實現(xiàn)類 b,則將為類 b 聲明接口,且類 a 將變?yōu)閷崿F(xiàn)類 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 屬性函數(shù)可以通過不同級別的訪問選項聲明。例如,Property Get 函數(shù)可以聲明為 Public 而 Property Let 可以聲明為 Friend。
Visual Basic.NET
屬性的 Get 和 Set 函數(shù)必須具有相同級別的訪問選項。這樣就便于 Visual Basic.NET 與其他 .NET 語言協(xié)同操作。
升級
向?qū)?/P>
如果訪問選項的級別不同,則新屬性為 Public。
默認(rèn)屬性
Visual
Basic 6.0 任何成員均可標(biāo)記為類的默認(rèn)值。
Visual Basic.NET
只有接受參數(shù)的屬性可以標(biāo)記為默認(rèn)值。對于將成為集合中的索引的帶參數(shù)屬性,這一情況很常見。
這使得代碼的可讀性更強,因為對沒有成員的對象變量的引用通常指向?qū)ο笞陨恚皇侵赶蛏舷挛闹械膶ο蠛推渌舷挛闹械哪J(rèn)屬性。例如,語句 Call Display(TextBox1) 可能是將文本框?qū)嵗齻鬟f給 Display 函數(shù),也可能是傳遞文本框的內(nèi)容。
此外,刪除這種二義性避免了使用單獨的語句執(zhí)行引用賦值。賦值 x = y 總是意味著將變量 y 的內(nèi)容賦值給變量 x,而不是將 y 引用的對象的默認(rèn)屬性賦值給 x 引用的對象的默認(rèn)屬性。
升級
向?qū)?/P>
盡可能解析默認(rèn)屬性。無法解析時(延遲綁定對象)將添加錯誤注釋。
枚舉
Visual
Basic 6.0 枚舉常數(shù)可以無限定地被引用。
Visual Basic.NET
如果在文件或項目級別為枚舉添加了 Import,則枚舉常數(shù)可以無限定引用。
這樣可以與類、結(jié)構(gòu)和接口保持一致,在類、結(jié)構(gòu)和接口中,可以給成員賦予通用名稱,而不必?fù)?dān)心與其他成員沖突。例如,Color 枚舉和 Fruit 枚舉均可以包含名稱為 Orange 的常數(shù)。在 Visual Basic 6.0 中的規(guī)則是,為枚舉常數(shù)加上前綴使每個常數(shù)保持唯一。這使常數(shù)名稱非常累贅,如 MsColorOrange 和 MsFruitOrange。
升級
向?qū)?/P>
對枚舉的引用將變?yōu)橥耆薅ā?/P>
While
Visual
Basic 6.0 While 語句以 WEnd 語句結(jié)束。
Visual Basic.NET
為了與其他塊結(jié)構(gòu)保持一致,While 的結(jié)束語句變?yōu)?End While。這提高了語言的一致性和可讀性。
升級
向?qū)?/P>
將 WEnd 語句變?yōu)?End While。
On...GoTo 和 On...GoSub
Visual
Basic 6.0 根據(jù)表達(dá)式的值,On expression GoTo destinationlist 和 On expression GoSub destinationlist 語句使程序轉(zhuǎn)向目標(biāo)列表中的若干個指定行之一。
Visual Basic.NET
On...GoTo 和 On...GoSub 是非結(jié)構(gòu)化的編程構(gòu)造。它們的使用讓程序更加難以閱讀和理解。Select Case 可以提供一種更加結(jié)構(gòu)化和靈活的方法來執(zhí)行多個分支。
注意:仍然支持 On Error GoTo。
升級
向?qū)?/P>
以下示例:
On MyVariable GoTo 100,200,300
將標(biāo)記有升級錯誤:
' UPGRADE_ISSUE On MyVariable GoTo was not upgraded
On MyVariable GoTo 100,200,300
您應(yīng)當(dāng)重寫代碼以避免使用這樣的語句,例如:
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 是非結(jié)構(gòu)化編程構(gòu)造。它的使用讓程序更加難以閱讀和理解。一個更加結(jié)構(gòu)化的替代方案是:創(chuàng)建可以調(diào)用的獨立過程。
升級
向?qū)?/P>
與 On...GoTo 相同,這些語句均標(biāo)記有升級錯誤。
LSet
Visual
Basic 6.0 LSet 用空格填充字符串使其為指定長度,或者將用戶定義類型的變量復(fù)制到另一個用戶定義類型的變量。
Visual Basic.NET
不支持 LSet 語句。LSet 對類型而言很不安全,因此會在運行時導(dǎo)致錯誤。此外,由于它對類型而言不安全,因此執(zhí)行時代碼必須完全可靠。刪除 LSet 語句后無法將一個結(jié)構(gòu)復(fù)制到另一個結(jié)構(gòu);但是,可以修改 Visual Basic.NET 代碼,使用 RtlCopyMemory 來獲得相同的效果。
升級
向?qū)?/P>
語句:
LSet a1 = a2
將標(biāo)記有升級錯誤
' 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 以整數(shù)形式返回變量的地址,然后將此地址傳遞到使用地址的 API 函數(shù)(例如 RtlCopyMemory)。VarPtr 返回變量的地址,StrPtr 返回字符串的地址,ObjPtr 返回對象的地址。這些函數(shù)均未記錄在文檔中。
Visual Basic.NET
可以檢索數(shù)據(jù)項的地址,但是檢索必須通過調(diào)用 CLR 才能進行。這是因為 CLR 通常可以在內(nèi)存中自由移動項目,因此需要讓 CLR 知道何時在使用地址,不能移動項目。以下示例檢索對象的地址:
Dim MyGCHandle As GCHandle = GCHandle.Alloc(o,GCHandleType.Pinned)
Dim Address As Integer = CInt(MyGCHandle.AddrOfPinnedObject())
'...
MyGCHandle.Free() '再次允許移動對象實例
允許運行時移動數(shù)據(jù)項目能夠改善運行時的性能。