從Visual Basic 6.0 到 Visual Basic.NET 的轉(zhuǎn)換
發(fā)表時(shí)間:2024-02-05 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Microsoft Visual Basic.NET 是 Microsoft Visual Basic 6.0 的后續(xù)版本,它是基于 .NET 框架重新設(shè)計(jì)的,您可以用它來(lái)輕松地創(chuàng)建用于 Microsoft Windows 32位 操作系統(tǒng)和 Web 的下一代應(yīng)用程序。使用 Visual Basi...
Microsoft Visual Basic.NET 是 Microsoft Visual Basic 6.0 的后續(xù)版本,它是基于 .NET 框架重新設(shè)計(jì)的,您可以用它來(lái)輕松地創(chuàng)建用于 Microsoft Windows 32位 操作系統(tǒng)和 Web 的下一代應(yīng)用程序。使用 Visual Basic.NET,可視化開發(fā) Web 應(yīng)用程序、Web 服務(wù)、Windows 應(yīng)用程序和服務(wù)器端組件將變得輕而易舉。此外,Visual Basic.NET 使用了 Windows 應(yīng)用程序的 XCOPY 部署方案,使您不必再擔(dān)心 DLL 版本問題。隨著 Visual Basic.NET 的發(fā)布,“DLL 噩夢(mèng)”將成為過(guò)去。
在設(shè)計(jì) Visual Basic.NET 時(shí),我們著眼于世界各地 Visual Basic 開發(fā)者的要求。Visual Basic 語(yǔ)言現(xiàn)在是真正的面向?qū)ο笳Z(yǔ)言,并支持實(shí)現(xiàn)繼承。窗體設(shè)計(jì)器支持可視化繼承,并包含窗體自動(dòng)調(diào)整大小、資源本地化和訪問選項(xiàng)支持等新特性,F(xiàn)在的數(shù)據(jù)工具繼續(xù)支持 XML 數(shù)據(jù),并可以共同使用設(shè)計(jì)時(shí)數(shù)據(jù)綁定和斷開數(shù)據(jù)。此外,Visual Basic.NET 是基于 .NET 框架直接創(chuàng)建的,因此可以使用所有的平臺(tái)特性,并能夠與其他 .NET 語(yǔ)言協(xié)同工作。
在發(fā)布這些功能的同時(shí),我們對(duì)產(chǎn)品的幾個(gè)方面作了修改。本文檔介紹了從 Visual Basic 6.0 到 Visual Basic.NET 的一些變更,并解釋了進(jìn)行這些變更的原因。本文還介紹 Visual Basic.NET 升級(jí)向?qū)У墓δ。它是作為產(chǎn)品的一部分提供的工具,可以幫助您將現(xiàn)有的應(yīng)用程序升級(jí)為 Visual Basic.NET 版本。
有關(guān)從 Visual Basic 6.0 升級(jí)到 Visual Basic.NET 的其他信息,請(qǐng)參閱白皮書《準(zhǔn)備將 Visual Basic 6.0 應(yīng)用程序升級(jí)到 Visual Basic.NET》(英文)。此白皮書介紹了升級(jí)過(guò)程并提供了盡可能順利升級(jí)的建設(shè)性意見。
語(yǔ)言
Variant
Visual Basic 6.0
Variant 是一種特殊的“通用”數(shù)據(jù)類型,可以包含除定長(zhǎng)字符串之外的各類數(shù)據(jù)。Object 變量用作指向?qū)ο蟮闹羔。默認(rèn)的數(shù)據(jù)類型為 Variant。
Visual Basic.NET
公共語(yǔ)言運(yùn)行時(shí) (CLR) 使用 Object 作為通用數(shù)據(jù)類型。Visual Basic.NET 沒有繼續(xù)使用 Variant 作為通用數(shù)據(jù)類型,而是選擇采用 CLR 命名規(guī)則,以避免在跨語(yǔ)言開發(fā)時(shí)造成混亂。僅使用一種通用數(shù)據(jù)類型將簡(jiǎn)化類型系統(tǒng)。默認(rèn)的數(shù)據(jù)類型為 Object。
升級(jí)向?qū)?br>
將 Variant 數(shù)據(jù)類型變?yōu)?Object,因此以下代碼:
Dim x As Variant
升級(jí)后將變?yōu)椋篋im x As Object
Integer 和 Long
Visual Basic 6.0
Long 變量存儲(chǔ)為帶有符號(hào)的 32 位數(shù)字,而 Integer 變量存儲(chǔ)為 16 位數(shù)字。
Visual Basic.NET
Long 變量存儲(chǔ)為帶有符號(hào)的 64 位數(shù)字,Integer 變量存儲(chǔ)為 32 位數(shù)字,而 Short 變量存儲(chǔ)為 16 位數(shù)字。在 32 位系統(tǒng)中,32 位整數(shù)操作比 16 位和 64 位整數(shù)操作都要快。這意味著 Integer 將是最有效和最基本的數(shù)字類型。
由于部分 .NET 框架技術(shù)以現(xiàn)代的 32 位和 64 位技術(shù)為基礎(chǔ),因此根據(jù)新技術(shù)更新數(shù)據(jù)大小是明智之舉。
升級(jí)向?qū)?br>
修改變量的類型,因此以下代碼:
Dim x As IntegerDim y As Long
升級(jí)后將變?yōu)椋?br>Dim x As ShortDim y As Integer
Currency
Visual Basic 6.0
Visual Basic 6.0 支持 Currency 數(shù)據(jù)類型。您不能將變量聲明為 Decimal 類型(雖然變量可以具有子類型 Decimal)。
Currency 變量以整數(shù)格式存儲(chǔ)為 64 位數(shù)字,以 10,000 為標(biāo)度,以將數(shù)字表示為定點(diǎn)數(shù),其小數(shù)點(diǎn)左邊為 15 位,右邊為 4 位。這種表示形式可以表示 -922,337,203,685,477.5808 至 922,337,203,685,477.5807 范圍內(nèi)的數(shù)字。
Decimal 變量存儲(chǔ)為帶有符號(hào)的 96 位整數(shù),標(biāo)度為 10 的不同乘冪。10 次冪的刻度因子指定了小數(shù)點(diǎn)右邊的數(shù)字位數(shù),其范圍為 0 至 28。當(dāng)指數(shù)為 0 時(shí)(無(wú)小數(shù)位數(shù)),最大的可能值為 +/-79,228,162,514,264,337,593,543,950,335。當(dāng)指數(shù)為 28 時(shí),最大值為 +/-7.9228162514264337593543950335,最小的非零值為 +/-0.0000000000000000000000000001。
Visual Basic.NET
Currency 數(shù)據(jù)類型的精度不夠,無(wú)法避免四舍五入的誤差,因此創(chuàng)建了 Decimal 這種數(shù)據(jù)類型。
升級(jí)向?qū)?br>
將 Currency 數(shù)據(jù)類型轉(zhuǎn)換為 Decimal,因此以下代碼:
Dim x As Currency
升級(jí)后將變?yōu)椋?br>Dim x As Decimal
Date
Visual Basic 6.0
Date 變量在內(nèi)部以 Double 格式存儲(chǔ),能夠作為 Double 類型的變量操作。
Date 變量存儲(chǔ)為 IEEE 64 位浮點(diǎn)數(shù),表示從 100 年 1 月 1 日到 9999 年 12 月 31 日的日期和從 0:00:00 到 23:59:59 的時(shí)間。任何可識(shí)別的文字日期都可以指定為 Date 變量。
當(dāng)其他數(shù)字類型轉(zhuǎn)換為 Date 時(shí),小數(shù)點(diǎn)左邊的值表示日期信息,而小數(shù)點(diǎn)右邊的值表示時(shí)間信息。午夜為 0,正午為 0.5。整個(gè)數(shù)值為負(fù)表示 1899 年 12 月 30 日之前的日期。
Visual Basic.NET
Date 在內(nèi)部存儲(chǔ)為 64 位整數(shù),因此無(wú)法直接作為 Double 進(jìn)行操作。.NET 框架提供了 ToOADate 和 FromOADate 函數(shù)以進(jìn)行 Double 和 Date 之間的轉(zhuǎn)換。將日期表示為整數(shù)形式可以簡(jiǎn)化并加速對(duì)日期的操作。
升級(jí)向?qū)?br>
升級(jí)工具并非能夠檢測(cè)到所有使用變量將 Date 存儲(chǔ)為 Double 的情況,但它一般會(huì)在將 Double 指定為 Date 的位置插入適當(dāng)?shù)?ToOADate 或 FromOADate 方法。例如,以下代碼:
Dim dbl As Double Dim dat As Date Dbl = dat
升級(jí)后將變?yōu)椋?br>Dim dbl As Double Dim dat As Date Dbl = dat.ToOADate
定長(zhǎng)字符串
Visual Basic 6.0
除類模塊的 Public 變量之外,其他變量均可以聲明為定長(zhǎng)字符串。
Visual Basic.NET
CLR 第一版不支持定長(zhǎng)字符串。在后續(xù)版本中將添加這一支持功能。
升級(jí)向?qū)?br>
在大多數(shù)情況下不會(huì)出現(xiàn)問題。假設(shè)為定長(zhǎng)字符串表現(xiàn)方式,則以下代碼:
Dim MyFixedLengthString As String * 100
升級(jí)后將變?yōu)椋?br>Dim MyFixedLengthString As New VB6.FixedLengthString(100)
有關(guān)該主題的全面說(shuō)明,請(qǐng)參閱白皮書《準(zhǔn)備將 Visual Basic 6.0 應(yīng)用程序升級(jí)到 Visual Basic.NET》(英文)。
Type
Visual Basic 6.0
Type 語(yǔ)句用于定義由用戶定義的數(shù)據(jù)類型。
Visual Basic.NET
Type 和 User-Defined Type 這兩個(gè)名稱會(huì)引起混淆,因?yàn)轭悺⒚杜e和接口也是可以由用戶定義的類型。Type 和 User-Defined Type 是從 QuickBasic 遺留下來(lái)的,在 QuickBasic 中用戶可以定義的類型只有結(jié)構(gòu)和記錄。CLR 使用 Type 這一名稱廣義地包含所有數(shù)據(jù)類型。
因此,在 Visual Basic.NET 中 Type 語(yǔ)句將變?yōu)?Structure。
升級(jí)向?qū)?br>
將 Type 語(yǔ)句變?yōu)?Structure,因此以下代碼:
Type MyType MyVariable As Integer End Type
升級(jí)后將變?yōu)椋?br>Structure MyType Dim MyVariable As Short End Structure
用戶定義類型存儲(chǔ)
Visual Basic 6.0
用戶定義的數(shù)據(jù)類型可以包含某種數(shù)據(jù)類型、數(shù)組或先前定義的用戶定義類型的一個(gè)或多個(gè)元素。在 Visual Basic 6.0 中,它們存儲(chǔ)在連續(xù)的內(nèi)存塊中。
Visual Basic.NET
格式是最有效的。它可能位于一段連續(xù)的內(nèi)存,也可能不。結(jié)構(gòu)可以被標(biāo)記為封送處理屬性,以確保能夠作為連續(xù)內(nèi)存塊傳遞到 COM 組件。
升級(jí)向?qū)?br>
在所有需要添加封送處理屬性的位置,API 均標(biāo)記有 TODO 注釋。(屬性不是自動(dòng)添加的,只有將結(jié)構(gòu)傳遞到 API 時(shí)才需要它們。)
True
Visual Basic 6.0
True 的值為 -1。
Visual Basic.NET
True 的值為 1。
鑒于語(yǔ)言的協(xié)同操作,需要一種適用于所有語(yǔ)言的一致表示法。
升級(jí)向?qū)?br>
如果將布爾值強(qiáng)制轉(zhuǎn)換為非布爾值,代碼將標(biāo)記有升級(jí)警告。例如,以下代碼:
Dim MyBoolean As BooleanDim MyInteger As Integer MyInteger = MyBoolean
升級(jí)后將變?yōu)椋?br>Dim MyBoolean As BooleanDim MyInteger As Short ' UPGRADE_WARNING: Boolean MyBoolean is being converted into a numeric MyInteger = MyBoolean
Empty
Visual Basic 6.0
變量均初始化為 Empty,當(dāng)用于數(shù)值表達(dá)式時(shí),變量將自動(dòng)轉(zhuǎn)換為零,當(dāng)用于字符串表達(dá)式時(shí),則自動(dòng)轉(zhuǎn)換為空字符串。
Visual Basic.NET
對(duì)象變量均初始化為 Nothing,當(dāng)用于數(shù)值表達(dá)式時(shí),變量將自動(dòng)轉(zhuǎn)換為零,當(dāng)用于字符串表達(dá)式時(shí),將自動(dòng)轉(zhuǎn)換為空字符串。使用 Nothing 代替特殊的 Empty 值可以降低語(yǔ)言的復(fù)雜性,語(yǔ)言協(xié)同操作性也更強(qiáng)。
升級(jí)向?qū)?br>
Null 和 Null 傳播
Visual Basic 6.0
Null 值為 Variant 的子類型,表示變量不包含有效數(shù)據(jù)。Null 值通過(guò)表達(dá)式和函數(shù)“傳播”。如果表達(dá)式的任一部分為 Null,則整個(gè)表達(dá)式為 Null。將 Null 作為參數(shù)傳遞給大多數(shù)函數(shù)時(shí),這些函數(shù)也將返回 Null。
Visual Basic.NET
不支持 Null 傳播。使用 ADO.NET 對(duì)數(shù)據(jù)進(jìn)行編程的模型用于在檢索字段的值之前先檢查字段的值是否為 Null。包含 null 的變量將作為 DBNull 類型的對(duì)象封送處理至 CLR。
Visual Basic.NET 處理 Null 時(shí)更加直接:字符串函數(shù)(例如 Left())總是返回字符串,與您的預(yù)期一樣。
升級(jí)向?qū)?br>
Null 值和 IsNull 函數(shù)標(biāo)記有升級(jí)警告注釋。例如,以下代碼:
If x Is Null Then MsgBox "Null"
升級(jí)后將變?yōu)椋?br>' UPGRADE_WARNING: Use of IsNull() detected If IsDBNull(x) Then MsgBox "Null"
Def<Type>
Visual Basic 6.0
DefBool、DefByte、DefInt、DefLng、DefCur、DefSng、DefDbl、DefDec、DefDate、DefStr、DefObj 和 DefVar 語(yǔ)句用于在模塊級(jí)設(shè)置變量、參數(shù)和過(guò)程返回類型(以指定字符開始)的默認(rèn)數(shù)據(jù)類型。
Visual Basic.NET
避免使用隱式類型聲明,提高了代碼的可讀性和可靠性。
升級(jí)向?qū)?br>
將變量類型的顯式聲明插入代碼。例如,以下代碼:
DefStr a-z
Sub MySub
s = "Hello"
End Sub
升級(jí)后將變?yōu)椋?br>Sub MySub
Dim s As String
s = "Hello"
End Sub
塊內(nèi)的局部變量
Visual Basic 6.0
從包含聲明的行至過(guò)程結(jié)束的范圍內(nèi),局部變量均可見。
Visual Basic.NET
Visual Basic.NET 支持變量的塊范圍。這意味著從包含聲明的行開始,至出現(xiàn)聲明的塊結(jié)束,局部變量均可見。例如:
Sub Test(x As Integer)
If x < 0 Then
Dim y As Integer = - x
'...
Else
'...
End If
End Sub
以上示例中的變量 y 僅在聲明該變量的塊中可用;更確切地說(shuō),它僅在其聲明至 Else 語(yǔ)句之間可用。如果需要在整個(gè)過(guò)程中使用變量,則必須在 If/Else/End If 控制結(jié)構(gòu)之外聲明該變量。
變量的塊范圍是許多結(jié)構(gòu)語(yǔ)言共有的功能。過(guò)程局部變量允許定義過(guò)程內(nèi)部變量,從而對(duì)結(jié)構(gòu)化編程提供支持,與此類似,塊級(jí)別變量允許定義代碼塊內(nèi)部變量,從而對(duì)結(jié)構(gòu)化分解提供支持。
升級(jí)向?qū)?br>
如果變量在塊內(nèi)聲明,變量將自動(dòng)移至模塊級(jí)范圍。例如,以下代碼:
If x =1 Then
Dim y As Integer
End If
升級(jí)后將變?yōu)椋?br>Dim y As Integer
If x =1 Then
End If
新的自動(dòng)重新實(shí)例化
Visual Basic 6.0
窗體的類變量聲明 Dim x As New <classname> 將導(dǎo)致編譯器每次引用 x 時(shí)生成代碼。此代碼檢查 x 是否為 Nothing;如果是 Nothing,則創(chuàng)建類的新實(shí)例。例如,以下代碼:
Dim x As New MyClass
'...
Call x.MyMethod()
等同于:
Dim x As MyClass
'...
If x Is Nothing Then
Set x = New MyClass
End If
Call x.MyMethod()
即使變量已經(jīng)設(shè)置為 Nothing,在下一次調(diào)用時(shí)該變量仍將重新實(shí)例化。
Visual Basic.NET
窗體的變量聲明 Dim x As New <classname> 等同于 Dim x As <classname> = New <classname>。引用通過(guò)此語(yǔ)法聲明的變量不會(huì)生成特殊代碼。
Visual Basic.NET 聲明 As New 比 Visual Basic 6.0 中的同一聲明更加有效。大多數(shù)對(duì)這類變量的引用不需要額外的開銷。而且,Visual Basic 6.0 的“自動(dòng)實(shí)例化”行為對(duì)于發(fā)現(xiàn)它的許多編程人員來(lái)說(shuō)非常古怪。
升級(jí)向?qū)?br>
這極少會(huì)成為問題。但是,如果代碼嘗試使用已設(shè)置為 Nothing 的類,將導(dǎo)致運(yùn)行時(shí)異常。該異常很容易檢測(cè)到。然后,可以方便地修改代碼以實(shí)例化類的新版本,如下例所示:
Dim x As New MyClass
x = Nothing
x = New MyClass
對(duì)象終結(jié)
Visual Basic 6.0
COM 引用計(jì)數(shù)機(jī)制用于垃圾回收對(duì)象實(shí)例。如果對(duì)象不在循環(huán)中,當(dāng)對(duì)象不再使用,引用計(jì)數(shù)會(huì)立即檢測(cè)到此情況,并且運(yùn)行終結(jié)代碼。
Visual Basic.NET
跟蹤垃圾回收器從存儲(chǔ)在堆棧變量、模塊變量和共享變量中的可及引用開始,將對(duì)象過(guò)一遍。此跟蹤進(jìn)程作為后臺(tái)任務(wù)運(yùn)行,因此在指向?qū)ο蟮淖詈笠粋(gè)引用結(jié)束和添加新引用之間有一個(gè)不定的時(shí)間段。
在某些情況下,客戶端確實(shí)需要能夠強(qiáng)制某一對(duì)象釋放資源。CLR 規(guī)定這樣的對(duì)象應(yīng)當(dāng)實(shí)現(xiàn) IDisposable 接口,這就提供了 Dispose 方法。當(dāng)客戶端結(jié)束對(duì)具有 Dispose 方法的對(duì)象的使用時(shí),它可以顯式調(diào)用 Dispose 方法以釋放其資源。例如,包裝數(shù)據(jù)庫(kù)連接的對(duì)象應(yīng)當(dāng)公開 Dispose 方法。
跟蹤垃圾回收器能夠正確釋放引用循環(huán)中的對(duì)象。此外,跟蹤垃圾回收器的性能比引用計(jì)數(shù)要好得多。
升級(jí)向?qū)?br>
在大多數(shù)情況下,這一改變不會(huì)導(dǎo)致問題。如果您的代碼中使用了資源句柄開放(連接或文件句柄),則必須顯式關(guān)閉此句柄。此問題易于檢測(cè)并會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。
數(shù)組
Visual Basic 6.0
數(shù)組可以由任何整數(shù)數(shù)字的上下限限定。如果在聲明中未指定下限,將使用 Option Base 語(yǔ)句確定默認(rèn)下限。
Visual Basic.NET
為了與其他語(yǔ)言協(xié)同操作,所有數(shù)組的下限均必須為零。這樣就不再需要 Option Base 語(yǔ)句。
升級(jí)向?qū)?br>
ReDim
Visual Basic 6.0
Visual Basic 6.0 中的固定大小數(shù)組和不定大小數(shù)組有所區(qū)別。固定大小數(shù)組通過(guò) Dim 語(yǔ)句聲明,在此語(yǔ)句包括此聲明中的數(shù)組界限。動(dòng)態(tài)數(shù)組在 Dim 語(yǔ)句中聲明,不指定界限信息。在使用動(dòng)態(tài)數(shù)組之前,需要通過(guò) ReDim 語(yǔ)句重新標(biāo)注動(dòng)態(tài)數(shù)組。在 Visual Basic 6.0 中,ReDim 語(yǔ)句提供了在單個(gè)語(yǔ)句中為動(dòng)態(tài)數(shù)組聲明和分配空間的快捷方法。ReDim 語(yǔ)句是 Visual Basic 6.0 中唯一能夠同時(shí)聲明和初始化變量的語(yǔ)句。
Visual Basic.NET
ReDim 語(yǔ)句僅用于為數(shù)組分配或重新分配空間,而不能用于重新分配數(shù)組。這是因?yàn)?Visual Basic.NET 中的所有數(shù)組均是動(dòng)態(tài)的,在 Visual Basic.NET 中 Dim 語(yǔ)句既可用于聲明動(dòng)態(tài)數(shù)組,又可用于初始化動(dòng)態(tài)數(shù)組。 由于所有變量聲明均可聲明變量并指定變量的初始值,使用 ReDim 同時(shí)聲明和初始化變量就變得多余和不必要了。只需要 Dim 語(yǔ)句聲明變量使語(yǔ)言更加簡(jiǎn)單、一致性更高。
升級(jí)向?qū)?br>
如果 ReDim() 用于聲明數(shù)組,在代碼中會(huì)自動(dòng)插入相應(yīng)的聲明。但是,最好的方法是您自己先在數(shù)組中插入 Dim 語(yǔ)句,因?yàn)槭褂?ReDim 聲明數(shù)組需要升級(jí)工具來(lái)推斷正確的聲明。使用 ReDim 也產(chǎn)生了不便處理的代碼,因?yàn)閿?shù)組在兩處進(jìn)行了同一聲明。
賦值
Visual Basic 6.0
賦值形式有兩種:Let 賦值(默認(rèn))和 Set 賦值。用 Set 語(yǔ)句為 cn 賦值。
Visual Basic.NET
僅有一種賦值形式。x = y 意味著將變量或?qū)傩?y 的值賦給變量或?qū)傩?x。對(duì)象類型變量的值是對(duì)對(duì)象實(shí)例的引用,因此如果 x 和 y 是引用類型的變量,將執(zhí)行引用賦值。這種單一形式的賦值減少了語(yǔ)言的復(fù)雜性,并使代碼可讀性更強(qiáng)。
升級(jí)向?qū)?br>
刪除 Set 和 Let 語(yǔ)句。解析強(qiáng)類型對(duì)象的默認(rèn)屬性,并將屬性顯式添加到代碼中。
有關(guān)該主題的全面說(shuō)明,請(qǐng)參閱白皮書《準(zhǔn)備將 Visual Basic 6.0 應(yīng)用程序升級(jí)到 Visual Basic.NET》(英文)。
And、Or、Xor 和 Not
Visual Basic 6.0
And、Or、Xor 和 Not 運(yùn)算符可以執(zhí)行邏輯運(yùn)算或位運(yùn)算(取決于表達(dá)式)。
Visual Basic.NET
And、Or 和 Xor 僅適用于布爾型。對(duì)于 And 和 Or 運(yùn)算符,如果第一個(gè)運(yùn)算數(shù)的值足以確定運(yùn)算符的結(jié)果,則運(yùn)算符將簡(jiǎn)化計(jì)算。新的運(yùn)算符 BitOr、BitAnd 和 BitXor 均用于位邏輯運(yùn)算。Bitxxx 運(yùn)算符不具有簡(jiǎn)化作用。
升級(jí)向?qū)?br>
如果 And/Or 語(yǔ)句是非布爾型或者包含函數(shù)、方法或?qū)傩,此語(yǔ)句將升級(jí)為使用兼容性函數(shù),與 Visual Basic 6.0 中的表現(xiàn)形式相同。如果 And/Or 語(yǔ)句是布爾型,此語(yǔ)句將升級(jí)為使用本地 Visual Basic.Net 語(yǔ)句。
有關(guān)該主題的全面說(shuō)明,請(qǐng)參閱白皮書《準(zhǔn)備將 Visual Basic 6.0 應(yīng)用程序升級(jí)到 Visual Basic.NET》(英文)。
運(yùn)算符優(yōu)先級(jí)
Visual Basic 6.0
邏輯和位的 And、Or、Xor 和 Not 運(yùn)算符的優(yōu)先級(jí)高于比較運(yùn)算符。
Visual Basic.NET
And、Or、Xor 和 Not 運(yùn)算符的優(yōu)先級(jí)低于比較運(yùn)算符,因此 a > b And a < c 將被認(rèn)為是 (a > b) And (a < c)。新的 BitAnd、BitOr 和 BitXor 運(yùn)算符的優(yōu)先級(jí)高于比較運(yùn)算符,因此 a BitAnd &HFFFF <> 0 將被認(rèn)為是 ((a BitAnd &HFFFF) <> 0)。
由于 BitAnd、BitOr 和 BitNot 運(yùn)算符可以返回?cái)?shù)值結(jié)果,因此其優(yōu)先級(jí)高于關(guān)系運(yùn)算符,這樣,就允許這三個(gè)運(yùn)算符返回的結(jié)果與其他值進(jìn)行比較。
升級(jí)向?qū)?br>
由升級(jí)向?qū)幚。有關(guān)該主題的全面說(shuō)明,請(qǐng)參閱白皮書《準(zhǔn)備將 Visual Basic 6.0 應(yīng)用程序升級(jí)到 Visual Basic.NET》(英文)。
調(diào)用過(guò)程
Visual Basic 6.0
支持兩種類型的過(guò)程調(diào)用:一種使用 Call 語(yǔ)句,要求使用括號(hào)括住參數(shù)列表;另一種不使用 Call 語(yǔ)句,不能使用括號(hào)來(lái)括住參數(shù)列表。
在 Visual Basic 6.0 中的一種常見情況是,開發(fā)者調(diào)用的過(guò)程不使用關(guān)鍵字,而又在參數(shù)列表外使用括號(hào)。幸運(yùn)的是,當(dāng)有一個(gè)以上的參數(shù)時(shí),編譯器會(huì)將其作為語(yǔ)法錯(cuò)誤檢測(cè)出來(lái)。但是,當(dāng)僅有一個(gè)參數(shù)時(shí),單一參數(shù)外的括號(hào)會(huì)將參數(shù)變量傳遞為 ByVal 而不是 ByRef。這會(huì)導(dǎo)致難以找到的小錯(cuò)誤。
Visual Basic.NET
在所有情況下參數(shù)列表均需要使用括號(hào)。
升級(jí)向?qū)?br>
為沒有使用括號(hào)的過(guò)程調(diào)用插入括號(hào)。
靜態(tài)過(guò)程
Visual Basic 6.0
通過(guò) Static 關(guān)鍵字可以聲明過(guò)程,此關(guān)鍵字表明在調(diào)用之間保留過(guò)程的局部變量。
Visual Basic.NET
在過(guò)程中不支持 Static 關(guān)鍵字,并且所有的靜態(tài)局部變量均需通過(guò) Static 語(yǔ)句顯式聲明。 需要將過(guò)程中的所有變量均聲明為靜態(tài)的情況很少。刪除此功能簡(jiǎn)化了語(yǔ)言,并且提高了可讀性,因?yàn)榫植孔兞靠偸俏挥诙褩V,除非已顯式聲明為 Static。
升級(jí)向?qū)?br>
如果過(guò)程標(biāo)記為 Static,則所有的局部變量均變?yōu)?Static。
參數(shù)的 ByVal/ByRef 默認(rèn)值
Visual Basic 6.0
參數(shù)未指定其默認(rèn)值為 ByVal 或 ByRef 時(shí),其默認(rèn)值為 ByRef。
Visual Basic.NET
<參數(shù)未指定其默認(rèn)值為 ByVal 或 ByRef 時(shí),其默認(rèn)值為 ByVal。
將參數(shù)默認(rèn)值指定為 ByVal 而不指定為 ByRef,可以避免過(guò)程錯(cuò)誤地修改由調(diào)用方傳遞的變量。這也使得默認(rèn)的調(diào)用規(guī)則與賦值一致,以便參數(shù)有效地綁定至表達(dá)式(通過(guò)表達(dá)式賦值為正式參數(shù))。 請(qǐng)用戶注意避免由 Visual Basic 6.0 升級(jí)到 Visual Basic.NET 帶來(lái)的混亂。如果用戶輸入的參數(shù)聲明未顯式指定其默認(rèn)值為 ByVal 或 ByRef,IDE 將為其自動(dòng)添加 ByVal 關(guān)鍵字。
升級(jí)向?qū)?br>
為沒有指定 ByVal 或 ByRef 為默認(rèn)值的參數(shù)添加 ByRef。
IsMissing 參數(shù)和可選參數(shù)
Visual Basic 6.0
沒有默認(rèn)值的可選 Variant 參數(shù)將被初始化為特殊的錯(cuò)誤代碼,此錯(cuò)誤代碼可以由 IsMissing 函數(shù)檢測(cè)出來(lái)。
Visual Basic.NET
在 Visual Basic.NET 中要求所有的可選參數(shù)均指定默認(rèn)值。這樣可以減少語(yǔ)言中特殊值的數(shù)量,從而簡(jiǎn)化語(yǔ)言。
升級(jí)向?qū)?br>
IsMissing 函數(shù)由 IsNothing 函數(shù)代替,并且標(biāo)記有升級(jí)警告注釋。
ParamArray 參數(shù)
Visual Basic 6.0
當(dāng)變量傳遞給 ParamArray 參數(shù)時(shí),可以通過(guò)被調(diào)用的函數(shù)修改。不支持 ByVal ParamArray 元素。
Visual Basic.NET
當(dāng)變量傳遞給 ParamArray 參數(shù)時(shí),不能通過(guò)被調(diào)用的函數(shù)修改。不支持 ByRef ParamArray 元素。
ParamArray 參數(shù)最常見的情況是不修改傳遞給此參數(shù)的變量。不支持 ByRef ParamArray 參數(shù)簡(jiǎn)化了 ParamArray 調(diào)用規(guī)則,因?yàn)?ParamArray 參數(shù)將被指定為正常數(shù)組。這樣,ParamArray 參數(shù)可以擴(kuò)展到任何元素類型,同時(shí)需要 ParamArray 參數(shù)的函數(shù)均可通過(guò)數(shù)組(而不是參數(shù)列表)直接調(diào)用。
升級(jí)向?qū)?br>
過(guò)程的 ParamArray 參數(shù)標(biāo)記有升級(jí)警告。例如,以下代碼:
Function MyFunction(ParamArray p() As Variant)
'...
End Function
升級(jí)后將變?yōu)椋?br>' 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,這樣對(duì)本地 API 的調(diào)用就可以傳遞任何數(shù)據(jù)類型。通過(guò)這一方法,可以調(diào)用參數(shù)支持兩種或多種數(shù)據(jù)類型的 API。
Visual Basic.NET
重載的 Declare 語(yǔ)句可以定義為允許調(diào)用帶有兩種或多種數(shù)據(jù)類型的本地 API。例如,以下 Declare 語(yǔ)句:
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
可以由兩個(gè) Declare 版本代替,一個(gè)接受 Long,一個(gè)接受字符串。
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)致程序失敗的小毛病。這一情況的存在是因?yàn)榫幾g器不允許通過(guò)沒有顯式定義的數(shù)據(jù)類型來(lái)調(diào)用 API。
升級(jí)向?qū)?br>
使用 As Any 參數(shù)的 Declare 語(yǔ)句標(biāo)記有升級(jí)警告。
Implements
Visual Basic 6.0
Implements 語(yǔ)句指定在其出現(xiàn)的類模塊中實(shí)現(xiàn)的接口或類。
Visual Basic.NET
Visual Basic.NET 中的 Implements 與 Visual Basic 6.0 中的 Implements 有兩個(gè)本質(zhì)區(qū)別:
在 Implements 語(yǔ)句中不能指定類。
每一種實(shí)現(xiàn)方法均要求在方法聲明語(yǔ)句的結(jié)束處使用 Implements 子句。該子句指定其實(shí)現(xiàn)的接口方法。
由于要求每一種實(shí)現(xiàn)接口方法的方法均使用 Implements 子句,所以提高了代碼的可讀性;在閱讀使用方法來(lái)實(shí)現(xiàn)接口方法的的代碼時(shí),這一優(yōu)點(diǎn)顯而易見。
升級(jí)向?qū)?br>
如果類 a 實(shí)現(xiàn)類 b,則將為類 b 聲明接口,且類 a 將變?yōu)閷?shí)現(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ù)可以通過(guò)不同級(jí)別的訪問選項(xiàng)聲明。例如,Property Get 函數(shù)可以聲明為 Public 而 Property Let 可以聲明為 Friend。
Visual Basic.NET
屬性的 Get 和 Set 函數(shù)必須具有相同級(jí)別的訪問選項(xiàng)。這樣就便于 Visual Basic.NET 與其他 .NET 語(yǔ)言協(xié)同操作。
升級(jí)向?qū)?br>
如果訪問選項(xiàng)的級(jí)別不同,則新屬性為 Public。
默認(rèn)屬性
Visual Basic 6.0
任何成員均可標(biāo)記為類的默認(rèn)值。
Visual Basic.NET
只有接受參數(shù)的屬性可以標(biāo)記為默認(rèn)值。對(duì)于將成為集合中的索引的帶參數(shù)屬性,這一情況很常見。
這使得代碼的可讀性更強(qiáng),因?yàn)閷?duì)沒有成員的對(duì)象變量的引用通常指向?qū)ο笞陨恚皇侵赶蛏舷挛闹械膶?duì)象和其他上下文中的默認(rèn)屬性。例如,語(yǔ)句 Call Display(TextBox1) 可能是將文本框?qū)嵗齻鬟f給 Display 函數(shù),也可能是傳遞文本框的內(nèi)容。
此外,刪除這種二義性避免了使用單獨(dú)的語(yǔ)句執(zhí)行引用賦值。賦值 x = y 總是意味著將變量 y 的內(nèi)容賦值給變量 x,而不是將 y 引用的對(duì)象的默認(rèn)屬性賦值給 x 引用的對(duì)象的默認(rèn)屬性。
升級(jí)向?qū)?br>
盡可能解析默認(rèn)屬性。無(wú)法解析時(shí)(延遲綁定對(duì)象)將添加錯(cuò)誤注釋。
枚舉
Visual Basic 6.0
枚舉常數(shù)可以無(wú)限定地被引用。
Visual Basic.NET
如果在文件或項(xiàng)目級(jí)別為枚舉添加了 Import,則枚舉常數(shù)可以無(wú)限定引用。 這樣可以與類、結(jié)構(gòu)和接口保持一致,在類、結(jié)構(gòu)和接口中,可以給成員賦予通用名稱,而不必?fù)?dān)心與其他成員沖突。例如,Color 枚舉和 Fruit 枚舉均可以包含名稱為 Orange 的常數(shù)。在 Visual Basic 6.0 中的規(guī)則是,為枚舉常數(shù)加上前綴使每個(gè)常數(shù)保持唯一。這使常數(shù)名稱非常累贅,如 MsColorOrange 和 MsFruitOrange。
升級(jí)向?qū)?br>
對(duì)枚舉的引用將變?yōu)橥耆薅ā?br>
While
Visual Basic 6.0
While 語(yǔ)句以 WEnd 語(yǔ)句結(jié)束。
Visual Basic.NET
為了與其他塊結(jié)構(gòu)保持一致,While 的結(jié)束語(yǔ)句變?yōu)?End While。這提高了語(yǔ)言的一致性和可讀性。
升級(jí)向?qū)?br>
將 WEnd 語(yǔ)句變?yōu)?End While。
On...GoTo 和 On...GoSub
Visual Basic 6.0
根據(jù)表達(dá)式的值,On expression GoTo destinationlist 和 On expression GoSub destinationlist 語(yǔ)句使程序轉(zhuǎn)向目標(biāo)列表中的若干個(gè)指定行之一。
Visual Basic.NET
On...GoTo 和 On...GoSub 是非結(jié)構(gòu)化的編程構(gòu)造。它們的使用讓程序更加難以閱讀和理解。Select Case 可以提供一種更加結(jié)構(gòu)化和靈活的方法來(lái)執(zhí)行多個(gè)分支。
注意:仍然支持 On Error GoTo。
升級(jí)向?qū)?br>
以下示例:
On MyVariable GoTo 100,200,300
將標(biāo)記有升級(jí)錯(cuò)誤:
' UPGRADE_ISSUE On MyVariable GoTo was not upgraded
On MyVariable GoTo 100,200,300
您應(yīng)當(dāng)重寫代碼以避免使用這樣的語(yǔ)句,例如:
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 語(yǔ)句在過(guò)程中分支到子例程,然后從子例程返回。
Visual Basic.NET
GoSub...Return 是非結(jié)構(gòu)化編程構(gòu)造。它的使用讓程序更加難以閱讀和理解。一個(gè)更加結(jié)構(gòu)化的替代方案是:創(chuàng)建可以調(diào)用的獨(dú)立過(guò)程。
升級(jí)向?qū)?br>
與 On...GoTo 相同,這些語(yǔ)句均標(biāo)記有升級(jí)錯(cuò)誤。
LSet
Visual Basic 6.0
LSet 用空格填充字符串使其為指定長(zhǎng)度,或者將用戶定義類型的變量復(fù)制到另一個(gè)用戶定義類型的變量。
Visual Basic.NET
不支持 LSet 語(yǔ)句。LSet 對(duì)類型而言很不安全,因此會(huì)在運(yùn)行時(shí)導(dǎo)致錯(cuò)誤。此外,由于它對(duì)類型而言不安全,因此執(zhí)行時(shí)代碼必須完全可靠。刪除 LSet 語(yǔ)句后無(wú)法將一個(gè)結(jié)構(gòu)復(fù)制到另一個(gè)結(jié)構(gòu);但是,可以修改 Visual Basic.NET 代碼,使用 RtlCopyMemory 來(lái)獲得相同的效果。
升級(jí)向?qū)?br>
語(yǔ)句:
LSet a1 = a2
將標(biāo)記有升級(jí)錯(cuò)誤
' 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 返回對(duì)象的地址。這些函數(shù)均未記錄在文檔中。
Visual Basic.NET
可以檢索數(shù)據(jù)項(xiàng)的地址,但是檢索必須通過(guò)調(diào)用 CLR 才能進(jìn)行。這是因?yàn)?CLR 通?梢栽趦(nèi)存中自由移動(dòng)項(xiàng)目,因此需要讓 CLR 知道何時(shí)在使用地址,不能移動(dòng)項(xiàng)目。以下示例檢索對(duì)象的地址:
Dim MyGCHandle As GCHandle = GCHandle.Alloc(o,GCHandleType.Pinned)
Dim Address As Integer = CInt(MyGCHandle.AddrOfPinnedObject())
'...
MyGCHandle.Free() '再次允許移動(dòng)對(duì)象實(shí)例
允許運(yùn)行時(shí)移動(dòng)數(shù)據(jù)項(xiàng)目能夠改善運(yùn)行時(shí)的性能。
升級(jí)向?qū)?br>
這些語(yǔ)句不會(huì)自動(dòng)升級(jí),因此將標(biāo)記有“(statement) is not supported”[(語(yǔ)句)不被支持] 的升級(jí)錯(cuò)誤。例如,以下代碼:
a = VarPtr(b)
升級(jí)后將變?yōu)椋?br>' UPGRADE_ISSUE: Function VarPtr() is not supported
a = VarPtr(b)
這也會(huì)導(dǎo)致編譯錯(cuò)誤。
文件 I/O
Visual Basic 6.0
語(yǔ)言中包括文件 I/O 語(yǔ)句。
Visual Basic.NET
通過(guò)類庫(kù)使用文件 I/O 操作。從語(yǔ)言中刪除文件 I/O 語(yǔ)句以便在 Visual Basic.NET 中使用不同的 I/O 庫(kù)。如果語(yǔ)言中存在文件 I/O 語(yǔ)句,將會(huì)使代碼更加累贅,標(biāo)識(shí)符 Open、Close、Print 和 Write 將成為保留字。
升級(jí)向?qū)?br>
文件 I/O 語(yǔ)句將升級(jí)為相應(yīng)的函數(shù)。例如,以下代碼:
Open nput )
Debug.Print
Visual Basic 6.0
Debug.Print 將一行文字輸出到“立即”窗口。
Visual Basic.NET
Debug.WriteLine 將一行文字輸出到“輸出”窗口。還可以使用 Debug.Write 方法將文字輸出到“輸出”窗口,并且沒有換行符。
升級(jí)向?qū)?br>
Debug.Print 升級(jí)為 Debug.WriteLine。
資源文件
Visual Basic 6.0
Visual Basic 6.0 支持每個(gè)工程使用一個(gè) .res 文件。
Visual Basic.NET
Visual Basic.NET 支持多種資源文件?梢越壎ù绑w以自動(dòng)從新的 .resX 格式資源文件中檢索資源。任何 CLR 類均可存儲(chǔ)在 .resX 文件中。
升級(jí)向?qū)?br>
文件由 .res 升級(jí)為 .resX,并且代碼被修改以便從 .resX 文件中加載。
Windows 應(yīng)用程序
Visual Basic 窗體
Visual Basic 6.0
Visual Basic 6.0 具有自己的窗體包,用于創(chuàng)建圖形 Windows 應(yīng)用程序。
Visual Basic.NET
對(duì)于 Visual Basic.NET,Windows 窗體是一種新的窗體包。由于 Windows 窗體是以公共語(yǔ)言運(yùn)行時(shí) (CLR) 為目標(biāo)構(gòu)造的,因此 Windows 窗體可以充分利用 CLR 的全部功能。特別是,由于 Windows 窗體包具有部署、應(yīng)用程序分離、版本和代碼訪問安全特性方面的優(yōu)勢(shì),您現(xiàn)在可以構(gòu)造基于 Windows 的客戶端應(yīng)用程序,其部署和更新明顯更加簡(jiǎn)易。您甚至可以構(gòu)造與 HTML 具有相同瀏覽器部署方案的 Windows 窗體應(yīng)用程序。正如代碼訪問安全性的粒度控制一樣,這些特性也使得在瀏覽器中使用 Windows 窗體控件非常令人矚目。
Windows 窗體集還為 Visual Basic 開發(fā)者提供了許多新功能,例如可視化繼承、改進(jìn)的本地化和訪問支持、自動(dòng)調(diào)整窗體大小和就地菜單編輯器。
升級(jí)向?qū)?br>
將 Visual Basic 窗體升級(jí)為 Windows 窗體。
PrintForm 方法
Visual Basic 6.0
PrintForm 方法將 Form 對(duì)象的圖象一個(gè)字節(jié)一個(gè)字節(jié)地發(fā)送至打印機(jī)。但是,此打印功能在某些窗體中無(wú)法正常工作。
Visual Basic.NET
在 Windows 窗體中,Visual Basic.NET 采用的打印框架使您可以快速生成復(fù)雜的打印文檔。它還包括內(nèi)置的“打印預(yù)覽”對(duì)話框。
升級(jí)向?qū)?br>
PrintForm 方法調(diào)用標(biāo)記有升級(jí)錯(cuò)誤。您可以使用新的打印框架創(chuàng)建打印文檔,甚至可以拍下應(yīng)用程序窗口的屏幕快照并進(jìn)行打印。
Circle、Cls、PSet、Line 和 Point 方法
Visual Basic 6.0
通過(guò) Circle、Cls、PSet、Line 和 Point 方法,您可以在窗體中繪圖,也可以清除這些圖象。
Visual Basic.NET
Windows 窗體具有一套新的圖形命令,用于替換 Circle、Cls、PSet、Line 和 Point。Windows 窗體包是在 GDI+ 的基礎(chǔ)上構(gòu)建的。GDI+ 是功能豐富的二維文字和圖象處理圖形庫(kù),現(xiàn)在可以直接在 Visual Basic.NET 中使用。在以前的版本中,如果不通過(guò) Declare 語(yǔ)句和 GDI API,Visual Basic 程序員無(wú)法使用這些功能。雖然這一轉(zhuǎn)變比較大,但是 GDI+ 的靈活性和強(qiáng)大功能讓程序員能夠快速開發(fā)應(yīng)用程序,而使用以前版本的 Visual Basic 將會(huì)花費(fèi)多得多的工作量。
升級(jí)向?qū)?br>
對(duì)這些方法的調(diào)用標(biāo)記有升級(jí)錯(cuò)誤。您可以在 System.Drawing 中記下使用 GDI+ 類的圖形調(diào)用。
Name 屬性
Visual Basic 6.0
Name 屬性返回代碼中使用的名稱以識(shí)別窗體、控件或數(shù)據(jù)訪問對(duì)象。在運(yùn)行時(shí)為只讀。
Visual Basic.NET
在運(yùn)行時(shí) Windows 窗體不支持窗體和控件的 Name 屬性。如果需要迭代 Controls 集合以查找某一名稱的控件,您可以使用 .NET 框架的 System.Reflection 類進(jìn)行查找。
升級(jí)向?qū)?br>
控件的 Name 屬性將標(biāo)記有升級(jí)錯(cuò)誤。
Caption 屬性
Visual Basic 6.0
某些控件(例如 Label)具有 Caption 屬性,用于確定在控件中或控件旁邊顯示的文字。其他控件(例如 TextBox)具有 Text 屬性,用于確定控件中包含的文字。
Visual Basic.NET
在 Windows 窗體中,對(duì)于所有控件,用于顯示控件中文字的屬性均統(tǒng)一稱為 Text。這簡(jiǎn)化了控件的使用。
升級(jí)向?qū)?br>
將控件的 Caption 屬性變?yōu)?Text。
Tag 屬性
Visual Basic 6.0
Tag 屬性可以返回或設(shè)置用于存儲(chǔ)程序所需額外數(shù)據(jù)的表達(dá)式。
在 Visual Basic 6.0 中無(wú)法擴(kuò)展內(nèi)置控件,所以 Tag 屬性是必需的。
Visual Basic.NET
在 Windows 窗體中,您可以使用繼承來(lái)擴(kuò)展內(nèi)置控件,并添加自己的屬性。將繼承作為工具使用明顯使內(nèi)置控件更加靈活。您不僅可以根據(jù)需要添加任意多種屬性,還可以將這些屬性設(shè)為強(qiáng)屬性。
升級(jí)向?qū)?br>
兼容庫(kù)中的 Windows 窗體擴(kuò)展程序 Tag 控件用于提供相同的功能。
ScaleMode 屬性
Visual Basic 6.0
ScaleMode 屬性返回或設(shè)置一個(gè)值,以在使用圖形方法或定位控件時(shí)表明對(duì)象的坐標(biāo)度量單位。
Visual Basic.NET
Windows 窗體始終使用象素作為度量單位,簡(jiǎn)化了窗體布局。
此外,Windows 窗體使用更好的方法來(lái)調(diào)整大小。AutoScaleBaseSize 屬性根據(jù)屏幕的分辨率 (dpi) 和使用的字體大小自動(dòng)調(diào)整縮放比例。
升級(jí)向?qū)?br>
使用“twip”(緹)(Visual Basic 6.0 中 ScaleMode 的默認(rèn)設(shè)置)的代碼將完全升級(jí)。如果 ScaleMode 為非緹,您將遇到調(diào)整大小方面的問題。
有關(guān)該主題的全面說(shuō)明,請(qǐng)參閱白皮書《準(zhǔn)備將 Visual Basic 6.0 應(yīng)用程序升級(jí)到 Visual Basic.NET》(英文)。
字體
Visual Basic 6.0
窗體和控件可以使用任何 Windows 字體。
Visual Basic.NET
窗體和控件只能使用 TrueType 或 OpenType 字體。使用這些類型的字體可以解決不同操作系統(tǒng)版本及其本地化版本之間的許多不一致性問題。這些字體還具有不依賴設(shè)備分辨率和反走樣等功能。
升級(jí)向?qū)?br>
如果在應(yīng)用程序中使用非 TrueType 字體,這些字體將變?yōu)槟J(rèn)的 Windows 窗體字體,但其格式(大小、粗體、斜體和下劃線)將會(huì)丟失。
Screen.MousePointer 屬性
Visual Basic 6.0
Screen 對(duì)象的 MousePointer 屬性可以返回或設(shè)置一個(gè)值,以表明運(yùn)行時(shí)鼠標(biāo)在應(yīng)用程序窗體外部顯示的鼠標(biāo)指針類型。
Visual Basic.NET
如果鼠標(biāo)指針位于應(yīng)用程序內(nèi)部的窗體中,則可以進(jìn)行操作;當(dāng)其位于應(yīng)用程序外時(shí)則不能。在今后的版本中我們將繼續(xù)完善其功能。
升級(jí)向?qū)?br>
使用 Screen.MousePointer 的語(yǔ)句標(biāo)記有升級(jí)錯(cuò)誤。
Timer.Interval 屬性
Visual Basic 6.0
Timer 控件的 Interval 屬性返回或設(shè)置 Timer 事件調(diào)用之間的毫秒數(shù)。如果設(shè)置為 0,則禁用 Timer 控件。Enabled 屬性還用于確定計(jì)時(shí)器是否在運(yùn)行。這將引起混亂,因?yàn)榧词?Enabled 屬性為 True,如果時(shí)間間隔為 0,仍不能啟用計(jì)時(shí)器。
Visual Basic.NET
Interval 屬性表明計(jì)時(shí)器刻度之間的時(shí)間(以毫秒為單位)。此屬性不能設(shè)置為 0。Enabled 屬性指定計(jì)時(shí)器是否在運(yùn)行。這一方式更加直接,可以簡(jiǎn)化 Timer 對(duì)象的編碼。
升級(jí)向?qū)?br>
如果 Timer.Interval 設(shè)置為 0,升級(jí)向?qū)軌驒z測(cè)到這一情況,并為 Timer.Interval 標(biāo)記升級(jí)錯(cuò)誤。
建議您在 Visual Basic 6.0 應(yīng)用程序中使用 Timer.Enabled,因?yàn)榇藢傩钥梢皂樌?jí)。
控件數(shù)組
Visual Basic 6.0
控件數(shù)組是一組共享同一名稱和類型的控件。它們也共享同一事件過(guò)程?丶䲠(shù)組至少有一個(gè)元素,只要您的系統(tǒng)資源和內(nèi)存允許,它可以有任意多個(gè)元素。同一控件數(shù)組的元素具有各自的屬性設(shè)置。
Visual Basic.NET
Windows 窗體體系結(jié)構(gòu)可以處理使用控制數(shù)組的多種方案。例如,在 Windows 窗體中可以通過(guò)單一事件句柄處理多個(gè)控件的多個(gè)事件。
升級(jí)向?qū)?br>
兼容庫(kù)中的“控件數(shù)組 Windows 窗體”擴(kuò)展程序控件提供了這種功能。
Menu 控件
Visual Basic 6.0
Menu 控件代表菜單樹中的各個(gè)項(xiàng)目。同一 Menu 控件實(shí)例可以同時(shí)在主菜單或上下文菜單中使用。
Visual Basic.NET
MenuItem 控件代表菜單樹中的各個(gè)項(xiàng)目。MenuItem 控件可以添加至 MainMenu 項(xiàng)目或 ContextMenu 項(xiàng)目,但不能同時(shí)添加。要在 MainMenu 對(duì)象和 ContextMenu 對(duì)象中共享菜單,可以在 MenuItem 中使用 CloneMenu 方法創(chuàng)建菜單副本。
升級(jí)向?qū)?br>
使用上下文菜單的代碼將標(biāo)記有升級(jí)錯(cuò)誤?梢允褂 MenuItem.CloneMenu 創(chuàng)建 MainMenu 項(xiàng)目的副本,用作 ContextMenu 項(xiàng)目。
OLE 容器控件
Visual Basic 6.0
OLE 容器控件使您可以將 OLE 對(duì)象添加至窗體。
Visual Basic.NET
Visual Basic.NET 中沒有 OLE 容器控件。如果需要與 OLE 容器控件相當(dāng)?shù)目丶,可以?WebBrowser 控件添加至窗體,并將其用作 OLE 容器控件。
升級(jí)向?qū)?br>
在升級(jí)報(bào)告中報(bào)告此升級(jí)錯(cuò)誤,并在窗體中放置不受支持控件的占位符。
Image 控件
Visual Basic 6.0
Image 和 PictureBox 控件均可顯示位圖、圖標(biāo)、圖元文件、增強(qiáng)型圖元文件、JPEG 或 GIF 文件的圖形。
Visual Basic.NET
Visual Basic.NET 中的 PictureBox 控件代替了 Visual Basic 6.0 中的 PictureBox 和 Image 控件。Windows 窗體中的 PictureBox 控件還支持動(dòng)態(tài) GIF 文件。但是,如果您需要一個(gè)簡(jiǎn)單方案,以便在窗體中繪制圖象,您也可以不使用窗體的 OnPaint 事件,而使用 DrawImage 方法。
升級(jí)向?qū)?br>
Image 控件變?yōu)?PictureBox 控件。
Line 和 Shape 控件
Visual Basic 6.0
Line 控件顯示水平線、垂直線或?qū)蔷。Shape 控件顯示矩形、正方形、橢圓形、圓形、圓角矩形或圓角正方形。
Visual Basic.NET
System.Drawing 中的 GDI+ 類代替了 Line 和 Shape 控件。要在窗體中繪制各種形狀的圖形,請(qǐng)不要使用 OnPaint 事件,而使用 GDI+ Draw 方法繪制圓、正方形等各種形狀。
升級(jí)向?qū)?br>
水平和垂直 Line 控件變?yōu)?Label 控件(沒有文字,高度或?qū)挾仍O(shè)置為 1)。對(duì)角線控件在升級(jí)報(bào)告中報(bào)告有升級(jí)錯(cuò)誤,并在窗體中放置不受支持控件的占位符。
矩形和正方形 Shape 控件變?yōu)?Label 控件。其他 Shape 控件在升級(jí)報(bào)告中報(bào)告有升級(jí)錯(cuò)誤,并在窗體中放置不受支持控件的占位符。
Windowless 控件
Visual Basic 6.0
輕便控件,有時(shí)稱為無(wú)窗口的控件,與常規(guī)控件最顯著區(qū)別是:沒有窗口句柄(hWnd 屬性)。因此,它們使用的系統(tǒng)資源較少。您可以在設(shè)計(jì)時(shí)將 Windowless 屬性設(shè)置為 True 以創(chuàng)建輕便用戶控件。輕便用戶控件只能包含其他輕便用戶控件。并非所有容器均支持輕便控件。
Visual Basic.NET
在 Windows 窗體中,大多數(shù)無(wú)窗口控件默認(rèn)在窗口中使用。使用無(wú)窗口控件的主要優(yōu)點(diǎn)是:當(dāng)窗體中有非常大量的控件時(shí),可以減少資源消耗(窗口句柄)。這僅限于 Windows 9x。Microsoft Windows NT? 和 Microsoft Windows 2000 沒有這種資源限制。
使用無(wú)窗口控件也有缺點(diǎn)(如分層等布局問題),但 Microsoft 認(rèn)識(shí)到了無(wú)窗口控件的作用,并將發(fā)布示例來(lái)展示如何在 Windows 窗體中獲得類似效果。
升級(jí)向?qū)?br>
無(wú)需特別處理。
Clipboard
Visual Basic 6.0
Clipboard 對(duì)象提供了對(duì)系統(tǒng)剪貼板的訪問。
Visual Basic.NET
Clipboard 類提供了在系統(tǒng)剪貼板上放置數(shù)據(jù)和從其上檢索數(shù)據(jù)的方法。新的 Clipboard 類提供了更多功能,并且支持的剪貼板格式比 Visual Basic 6.0 Clipboard 對(duì)象更多。對(duì)象模塊經(jīng)過(guò)了重新構(gòu)建以支持這些功能。
升級(jí)向?qū)?br>
由于對(duì)象模塊之間的差異,現(xiàn)有的剪貼板代碼無(wú)法自動(dòng)升級(jí)。Clipboard 語(yǔ)句將標(biāo)記有升級(jí)錯(cuò)誤。
動(dòng)態(tài)數(shù)據(jù)交換
Visual Basic 6.0
某些控件具有支持動(dòng)態(tài)數(shù)據(jù)交換 (DDE) 會(huì)話的屬性和方法。
Visual Basic.NET
Windows 窗體不支持內(nèi)置 DDE。
升級(jí)向?qū)?br>
DDE 屬性和方法標(biāo)記有升級(jí)警告。
Web 應(yīng)用程序
WebClass
Visual Basic 6.0
WebClass 是駐留在 Web 服務(wù)器上的 Visual Basic 組件,能夠響應(yīng)瀏覽器的輸入。WebClass 通常包括 WebItems,用于為瀏覽器和公開事件提供內(nèi)容。
Visual Basic.NET
Web 窗體具有 .NET 框架功能,可以用來(lái)為 Web 應(yīng)用程序創(chuàng)建基于瀏覽器的用戶界面。Visual Basic.NET 具有“所見即所得”的設(shè)計(jì)器,可以使用工具箱中的控件創(chuàng)建圖形 Web 窗體。這樣,Web 用戶界面開發(fā)與 Windows 開發(fā)具有同樣的形式。此外,當(dāng)創(chuàng)建項(xiàng)目后,Internet Information Services (IIS) 服務(wù)器不必停止并重新啟動(dòng)即可開始部署新內(nèi)容,而使用 WebClass 則不能。
升級(jí)向?qū)?br>
WebClass 將升級(jí)為 Web 窗體。所有狀態(tài)存儲(chǔ)調(diào)用均標(biāo)記有升級(jí)警告?梢灾匦戮帉戇@些代碼,以使用 ASP.NET 狀態(tài)管理的優(yōu)勢(shì)。
您也可以選擇繼續(xù)使用 Visual Basic 6.0 中的 WebClass 應(yīng)用程序,從 Visual Basic.NET Web 窗體中定位至 WebClass 和 WebForm,等等。
ActiveX 文檔和 DHTML 應(yīng)用程序
Visual Basic 6.0
ActiveX 文檔在 Internet 瀏覽器窗口中顯示,并提供內(nèi)置的視區(qū)滾動(dòng)、超鏈接和菜單協(xié)商。DHTML 應(yīng)用程序包含 DHTML 頁(yè)面和客戶端 ActiveX DLL。
Visual Basic.NET
Web 窗體通過(guò)采用 HTML 以支持多種應(yīng)用程序。通過(guò)使用寄存在瀏覽器中的 Windows 窗體控件或已下載的“安全 Windows 窗體”EXE,它能夠以更安全的方式支持多種應(yīng)用程序。此代碼在安全沙箱中運(yùn)行,因此不會(huì)對(duì)用戶的計(jì)算機(jī)造成損害。
升級(jí)向?qū)?br>
雖然 ActiveX 文檔和 DHTML 應(yīng)用程序無(wú)法直接升級(jí),您仍可以在 ActiveX 文檔、DHTML 應(yīng)用程序和 Web 窗體之間切換。
數(shù)據(jù)
ADO、RDO 和 DAO 代碼
Visual Basic 6.0
ActiveX 數(shù)據(jù)對(duì)象 (ADO)、遠(yuǎn)程數(shù)據(jù)對(duì)象 (RDO) 和數(shù)據(jù)訪問對(duì)象 (DAO) 用于連接和斷開數(shù)據(jù)訪問。
Visual Basic.NET
ADO.NET 提供了斷開數(shù)據(jù)訪問的其他類。與用于分布式應(yīng)用程序的較早版本 ADO 相比,這些類提供了更好的性能和可伸縮性。它們也使 XML 數(shù)據(jù)與數(shù)據(jù)庫(kù)數(shù)據(jù)的集成更加簡(jiǎn)單。
升級(jí)
Visual Basic.NET 代碼中仍然可以使用 ADO、RDO 和 DAO。
ADO、RDO 和 DAO 數(shù)據(jù)綁定
Visual Basic 6.0
Visual Basic 窗體中的控件可以綁定到 ActiveX? 數(shù)據(jù)對(duì)象 (ADO)、遠(yuǎn)程數(shù)據(jù)對(duì)象 (RDO) 和數(shù)據(jù)訪問對(duì)象 (DAO) 數(shù)據(jù)源。
Visual Basic.NET
ADO.NET 為 Windows 窗體控件提供了讀/寫數(shù)據(jù)綁定,為 Web 窗體提供了只讀數(shù)據(jù)綁定。
升級(jí)向?qū)?br>
ADO 數(shù)據(jù)綁定升級(jí)為新的 ADO.NET 數(shù)據(jù)綁定。但是,RDO 和 DAO 數(shù)據(jù)綁定無(wú)法升級(jí),將會(huì)在升級(jí)報(bào)告中報(bào)告升級(jí)錯(cuò)誤。
IDE
“立即”窗口
Visual Basic 6.0
在設(shè)計(jì)模式的“立即”窗口,您可以運(yùn)行部分代碼,而不必通過(guò)其 Startup 對(duì)象啟動(dòng)整個(gè)應(yīng)用程序。例如,可以顯示窗體、調(diào)用模塊過(guò)程以及與全局變量交互。這是因?yàn)?Visual Basic 6.0 是從代碼的內(nèi)存映象運(yùn)行,而不是調(diào)試運(yùn)行時(shí)使用的已創(chuàng)建輸出。
Visual Basic.NET
可以從設(shè)計(jì)模式的“命令”窗口中執(zhí)行 IDE 命令,但是不能運(yùn)行應(yīng)用程序的各個(gè)部分。這是因?yàn)?Visual Basic.NET 的運(yùn)行和調(diào)試所使用的是運(yùn)行時(shí)的實(shí)際輸出。這種形式的調(diào)試最精確地再現(xiàn)了運(yùn)行時(shí)的行為。
IDE 和項(xiàng)目擴(kuò)展性
Visual Basic 6.0
只有 Visual Basic 6.0 支持 Visual Basic 6.0 集成開發(fā)環(huán)境 (IDE) 擴(kuò)展模型。
Visual Basic.NET
對(duì)于 Visual Studio.NET 中的所有工程類型,新的 IDE 擴(kuò)展模型是通用的。這使得創(chuàng)建與多種不同類型工程協(xié)作的外接程序更加簡(jiǎn)單。Visual Basic 工程系統(tǒng)擴(kuò)展模型也可以與 C# 共享,因此工程的特定功能(例如添加引用或更改工程屬性)在兩種語(yǔ)言中的用法相同。
Visual Studio.NET 代碼模型也給擴(kuò)展級(jí)編寫者提供了公共對(duì)象模型,以編寫跨不同語(yǔ)言工程使用的代碼。Visual Basic 支持通過(guò)代碼模型讀取代碼。要編寫代碼,您可以從模型中取出一個(gè)插入點(diǎn),然后寫入 Visual Basic 語(yǔ)法。
(llm9178整理)