明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

從Visual Basic 6.0 到 Visual Basic.NET 的轉(zhuǎn)換

[摘要]Microsoft Visual Basic.NET 是 Microsoft Visual Basic 6.0 的后續(xù)版本,它是基于 .NET 框架重新設計的,您可以用它來輕松地創(chuàng)建用于 Microsoft Windows 32位 操作系統(tǒng)和 Web 的下一代應用程序。使用 Visual Basi...
Microsoft Visual Basic.NET 是 Microsoft Visual Basic 6.0 的后續(xù)版本,它是基于 .NET 框架重新設計的,您可以用它來輕松地創(chuàng)建用于 Microsoft Windows 32位 操作系統(tǒng)和 Web 的下一代應用程序。使用 Visual Basic.NET,可視化開發(fā) Web 應用程序、Web 服務、Windows 應用程序和服務器端組件將變得輕而易舉。此外,Visual Basic.NET 使用了 Windows 應用程序的 XCOPY 部署方案,使您不必再擔心 DLL 版本問題。隨著 Visual Basic.NET 的發(fā)布,“DLL 噩夢”將成為過去。
  在設計 Visual Basic.NET 時,我們著眼于世界各地 Visual Basic 開發(fā)者的要求。Visual Basic 語言現(xiàn)在是真正的面向?qū)ο笳Z言,并支持實現(xiàn)繼承。窗體設計器支持可視化繼承,并包含窗體自動調(diào)整大小、資源本地化和訪問選項支持等新特性,F(xiàn)在的數(shù)據(jù)工具繼續(xù)支持 XML 數(shù)據(jù),并可以共同使用設計時數(shù)據(jù)綁定和斷開數(shù)據(jù)。此外,Visual Basic.NET 是基于 .NET 框架直接創(chuàng)建的,因此可以使用所有的平臺特性,并能夠與其他 .NET 語言協(xié)同工作。
在發(fā)布這些功能的同時,我們對產(chǎn)品的幾個方面作了修改。本文檔介紹了從 Visual Basic 6.0 到 Visual Basic.NET 的一些變更,并解釋了進行這些變更的原因。本文還介紹 Visual Basic.NET 升級向?qū)У墓δ。它是作為產(chǎn)品的一部分提供的工具,可以幫助您將現(xiàn)有的應用程序升級為 Visual Basic.NET 版本。
有關(guān)從 Visual Basic 6.0 升級到 Visual Basic.NET 的其他信息,請參閱白皮書《準備將 Visual Basic 6.0 應用程序升級到 Visual Basic.NET》(英文)。此白皮書介紹了升級過程并提供了盡可能順利升級的建設性意見。
語言

Variant
Visual Basic 6.0
Variant 是一種特殊的“通用”數(shù)據(jù)類型,可以包含除定長字符串之外的各類數(shù)據(jù)。Object 變量用作指向?qū)ο蟮闹羔。默認的數(shù)據(jù)類型為 Variant。

Visual Basic.NET
公共語言運行時 (CLR) 使用 Object 作為通用數(shù)據(jù)類型。Visual Basic.NET 沒有繼續(xù)使用 Variant 作為通用數(shù)據(jù)類型,而是選擇采用 CLR 命名規(guī)則,以避免在跨語言開發(fā)時造成混亂。僅使用一種通用數(shù)據(jù)類型將簡化類型系統(tǒng)。默認的數(shù)據(jù)類型為 Object。

升級向?qū)?br>
將 Variant 數(shù)據(jù)類型變?yōu)?Object,因此以下代碼:
Dim x As Variant
升級后將變?yōu)椋篋im x As Object

Integer 和 Long

Visual Basic 6.0
Long 變量存儲為帶有符號的 32 位數(shù)字,而 Integer 變量存儲為 16 位數(shù)字。

Visual Basic.NET
Long 變量存儲為帶有符號的 64 位數(shù)字,Integer 變量存儲為 32 位數(shù)字,而 Short 變量存儲為 16 位數(shù)字。在 32 位系統(tǒng)中,32 位整數(shù)操作比 16 位和 64 位整數(shù)操作都要快。這意味著 Integer 將是最有效和最基本的數(shù)字類型。
由于部分 .NET 框架技術(shù)以現(xiàn)代的 32 位和 64 位技術(shù)為基礎(chǔ),因此根據(jù)新技術(shù)更新數(shù)據(jù)大小是明智之舉。

升級向?qū)?br>
修改變量的類型,因此以下代碼:
Dim x As IntegerDim y As Long
升級后將變?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ù)格式存儲為 64 位數(shù)字,以 10,000 為標度,以將數(shù)字表示為定點數(shù),其小數(shù)點左邊為 15 位,右邊為 4 位。這種表示形式可以表示 -922,337,203,685,477.5808 至 922,337,203,685,477.5807 范圍內(nèi)的數(shù)字。
Decimal 變量存儲為帶有符號的 96 位整數(shù),標度為 10 的不同乘冪。10 次冪的刻度因子指定了小數(shù)點右邊的數(shù)字位數(shù),其范圍為 0 至 28。當指數(shù)為 0 時(無小數(shù)位數(shù)),最大的可能值為 +/-79,228,162,514,264,337,593,543,950,335。當指數(shù)為 28 時,最大值為 +/-7.9228162514264337593543950335,最小的非零值為 +/-0.0000000000000000000000000001。

Visual Basic.NET
Currency 數(shù)據(jù)類型的精度不夠,無法避免四舍五入的誤差,因此創(chuàng)建了 Decimal 這種數(shù)據(jù)類型。

升級向?qū)?br>
將 Currency 數(shù)據(jù)類型轉(zhuǎn)換為 Decimal,因此以下代碼:
Dim x As Currency
升級后將變?yōu)椋?br>Dim x As Decimal

Date
Visual Basic 6.0
Date 變量在內(nèi)部以 Double 格式存儲,能夠作為 Double 類型的變量操作。
Date 變量存儲為 IEEE 64 位浮點數(shù),表示從 100 年 1 月 1 日到 9999 年 12 月 31 日的日期和從 0:00:00 到 23:59:59 的時間。任何可識別的文字日期都可以指定為 Date 變量。
當其他數(shù)字類型轉(zhuǎn)換為 Date 時,小數(shù)點左邊的值表示日期信息,而小數(shù)點右邊的值表示時間信息。午夜為 0,正午為 0.5。整個數(shù)值為負表示 1899 年 12 月 30 日之前的日期。

Visual Basic.NET
Date 在內(nèi)部存儲為 64 位整數(shù),因此無法直接作為 Double 進行操作。.NET 框架提供了 ToOADate 和 FromOADate 函數(shù)以進行 Double 和 Date 之間的轉(zhuǎn)換。將日期表示為整數(shù)形式可以簡化并加速對日期的操作。

升級向?qū)?br>
升級工具并非能夠檢測到所有使用變量將 Date 存儲為 Double 的情況,但它一般會在將 Double 指定為 Date 的位置插入適當?shù)?ToOADate 或 FromOADate 方法。例如,以下代碼:
Dim dbl As Double Dim dat As Date Dbl = dat
升級后將變?yōu)椋?br>Dim dbl As Double Dim dat As Date Dbl = dat.ToOADate

定長字符串
Visual Basic 6.0
除類模塊的 Public 變量之外,其他變量均可以聲明為定長字符串。

Visual Basic.NET
CLR 第一版不支持定長字符串。在后續(xù)版本中將添加這一支持功能。

升級向?qū)?br>
在大多數(shù)情況下不會出現(xiàn)問題。假設為定長字符串表現(xiàn)方式,則以下代碼:
Dim MyFixedLengthString As String * 100
升級后將變?yōu)椋?br>Dim MyFixedLengthString As New VB6.FixedLengthString(100)
有關(guān)該主題的全面說明,請參閱白皮書《準備將 Visual Basic 6.0 應用程序升級到 Visual Basic.NET》(英文)。

Type
Visual Basic 6.0
Type 語句用于定義由用戶定義的數(shù)據(jù)類型。

Visual Basic.NET
Type 和 User-Defined Type 這兩個名稱會引起混淆,因為類、枚舉和接口也是可以由用戶定義的類型。Type 和 User-Defined Type 是從 QuickBasic 遺留下來的,在 QuickBasic 中用戶可以定義的類型只有結(jié)構(gòu)和記錄。CLR 使用 Type 這一名稱廣義地包含所有數(shù)據(jù)類型。
因此,在 Visual Basic.NET 中 Type 語句將變?yōu)?Structure。

升級向?qū)?br>
將 Type 語句變?yōu)?Structure,因此以下代碼:
Type MyType MyVariable As Integer End Type
升級后將變?yōu)椋?br>Structure MyType Dim MyVariable As Short End Structure

用戶定義類型存儲
Visual Basic 6.0
用戶定義的數(shù)據(jù)類型可以包含某種數(shù)據(jù)類型、數(shù)組或先前定義的用戶定義類型的一個或多個元素。在 Visual Basic 6.0 中,它們存儲在連續(xù)的內(nèi)存塊中。

Visual Basic.NET
格式是最有效的。它可能位于一段連續(xù)的內(nèi)存,也可能不。結(jié)構(gòu)可以被標記為封送處理屬性,以確保能夠作為連續(xù)內(nèi)存塊傳遞到 COM 組件。

升級向?qū)?br>
在所有需要添加封送處理屬性的位置,API 均標記有 TODO 注釋。(屬性不是自動添加的,只有將結(jié)構(gòu)傳遞到 API 時才需要它們。)

True
Visual Basic 6.0
True 的值為 -1。

Visual Basic.NET
True 的值為 1。
鑒于語言的協(xié)同操作,需要一種適用于所有語言的一致表示法。

升級向?qū)?br>
如果將布爾值強制轉(zhuǎn)換為非布爾值,代碼將標記有升級警告。例如,以下代碼:
Dim MyBoolean As BooleanDim MyInteger As Integer MyInteger = MyBoolean
升級后將變?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,當用于數(shù)值表達式時,變量將自動轉(zhuǎn)換為零,當用于字符串表達式時,則自動轉(zhuǎn)換為空字符串。

Visual Basic.NET
對象變量均初始化為 Nothing,當用于數(shù)值表達式時,變量將自動轉(zhuǎn)換為零,當用于字符串表達式時,將自動轉(zhuǎn)換為空字符串。使用 Nothing 代替特殊的 Empty 值可以降低語言的復雜性,語言協(xié)同操作性也更強。

升級向?qū)?br>
Null 和 Null 傳播
Visual Basic 6.0
Null 值為 Variant 的子類型,表示變量不包含有效數(shù)據(jù)。Null 值通過表達式和函數(shù)“傳播”。如果表達式的任一部分為 Null,則整個表達式為 Null。將 Null 作為參數(shù)傳遞給大多數(shù)函數(shù)時,這些函數(shù)也將返回 Null。

Visual Basic.NET
不支持 Null 傳播。使用 ADO.NET 對數(shù)據(jù)進行編程的模型用于在檢索字段的值之前先檢查字段的值是否為 Null。包含 null 的變量將作為 DBNull 類型的對象封送處理至 CLR。
Visual Basic.NET 處理 Null 時更加直接:字符串函數(shù)(例如 Left())總是返回字符串,與您的預期一樣。

升級向?qū)?br>
Null 值和 IsNull 函數(shù)標記有升級警告注釋。例如,以下代碼:
If x Is Null Then MsgBox "Null"
升級后將變?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 語句用于在模塊級設置變量、參數(shù)和過程返回類型(以指定字符開始)的默認數(shù)據(jù)類型。

Visual Basic.NET
避免使用隱式類型聲明,提高了代碼的可讀性和可靠性。

升級向?qū)?br>
將變量類型的顯式聲明插入代碼。例如,以下代碼:
DefStr a-z
Sub MySub
s = "Hello"
End Sub
升級后將變?yōu)椋?br>Sub MySub
Dim s As String
s = "Hello"
End Sub

塊內(nèi)的局部變量
Visual Basic 6.0
從包含聲明的行至過程結(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 僅在聲明該變量的塊中可用;更確切地說,它僅在其聲明至 Else 語句之間可用。如果需要在整個過程中使用變量,則必須在 If/Else/End If 控制結(jié)構(gòu)之外聲明該變量。
變量的塊范圍是許多結(jié)構(gòu)語言共有的功能。過程局部變量允許定義過程內(nèi)部變量,從而對結(jié)構(gòu)化編程提供支持,與此類似,塊級別變量允許定義代碼塊內(nèi)部變量,從而對結(jié)構(gòu)化分解提供支持。

升級向?qū)?br>
如果變量在塊內(nèi)聲明,變量將自動移至模塊級范圍。例如,以下代碼:
If x =1 Then
Dim y As Integer
End If
升級后將變?yōu)椋?br>Dim y As Integer
If x =1 Then
End If

新的自動重新實例化
Visual Basic 6.0
窗體的類變量聲明 Dim x As New <classname> 將導致編譯器每次引用 x 時生成代碼。此代碼檢查 x 是否為 Nothing;如果是 Nothing,則創(chuàng)建類的新實例。例如,以下代碼:
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)設置為 Nothing,在下一次調(diào)用時該變量仍將重新實例化。

Visual Basic.NET
窗體的變量聲明 Dim x As New <classname> 等同于 Dim x As <classname> = New <classname>。引用通過此語法聲明的變量不會生成特殊代碼。
Visual Basic.NET 聲明 As New 比 Visual Basic 6.0 中的同一聲明更加有效。大多數(shù)對這類變量的引用不需要額外的開銷。而且,Visual Basic 6.0 的“自動實例化”行為對于發(fā)現(xiàn)它的許多編程人員來說非常古怪。

升級向?qū)?br>
這極少會成為問題。但是,如果代碼嘗試使用已設置為 Nothing 的類,將導致運行時異常。該異常很容易檢測到。然后,可以方便地修改代碼以實例化類的新版本,如下例所示:
Dim x As New MyClass
x = Nothing
x = New MyClass

對象終結(jié)
Visual Basic 6.0
COM 引用計數(shù)機制用于垃圾回收對象實例。如果對象不在循環(huán)中,當對象不再使用,引用計數(shù)會立即檢測到此情況,并且運行終結(jié)代碼。

Visual Basic.NET
跟蹤垃圾回收器從存儲在堆棧變量、模塊變量和共享變量中的可及引用開始,將對象過一遍。此跟蹤進程作為后臺任務運行,因此在指向?qū)ο蟮淖詈笠粋引用結(jié)束和添加新引用之間有一個不定的時間段。
在某些情況下,客戶端確實需要能夠強制某一對象釋放資源。CLR 規(guī)定這樣的對象應當實現(xiàn) IDisposable 接口,這就提供了 Dispose 方法。當客戶端結(jié)束對具有 Dispose 方法的對象的使用時,它可以顯式調(diào)用 Dispose 方法以釋放其資源。例如,包裝數(shù)據(jù)庫連接的對象應當公開 Dispose 方法。
跟蹤垃圾回收器能夠正確釋放引用循環(huán)中的對象。此外,跟蹤垃圾回收器的性能比引用計數(shù)要好得多。

升級向?qū)?br>
在大多數(shù)情況下,這一改變不會導致問題。如果您的代碼中使用了資源句柄開放(連接或文件句柄),則必須顯式關(guān)閉此句柄。此問題易于檢測并會導致運行時錯誤。

數(shù)組
Visual Basic 6.0
數(shù)組可以由任何整數(shù)數(shù)字的上下限限定。如果在聲明中未指定下限,將使用 Option Base 語句確定默認下限。

Visual Basic.NET
為了與其他語言協(xié)同操作,所有數(shù)組的下限均必須為零。這樣就不再需要 Option Base 語句。

升級向?qū)?br>
ReDim
Visual Basic 6.0
Visual Basic 6.0 中的固定大小數(shù)組和不定大小數(shù)組有所區(qū)別。固定大小數(shù)組通過 Dim 語句聲明,在此語句包括此聲明中的數(shù)組界限。動態(tài)數(shù)組在 Dim 語句中聲明,不指定界限信息。在使用動態(tài)數(shù)組之前,需要通過 ReDim 語句重新標注動態(tài)數(shù)組。在 Visual Basic 6.0 中,ReDim 語句提供了在單個語句中為動態(tài)數(shù)組聲明和分配空間的快捷方法。ReDim 語句是 Visual Basic 6.0 中唯一能夠同時聲明和初始化變量的語句。

Visual Basic.NET
ReDim 語句僅用于為數(shù)組分配或重新分配空間,而不能用于重新分配數(shù)組。這是因為 Visual Basic.NET 中的所有數(shù)組均是動態(tài)的,在 Visual Basic.NET 中 Dim 語句既可用于聲明動態(tài)數(shù)組,又可用于初始化動態(tài)數(shù)組。 由于所有變量聲明均可聲明變量并指定變量的初始值,使用 ReDim 同時聲明和初始化變量就變得多余和不必要了。只需要 Dim 語句聲明變量使語言更加簡單、一致性更高。

升級向?qū)?br>
如果 ReDim() 用于聲明數(shù)組,在代碼中會自動插入相應的聲明。但是,最好的方法是您自己先在數(shù)組中插入 Dim 語句,因為使用 ReDim 聲明數(shù)組需要升級工具來推斷正確的聲明。使用 ReDim 也產(chǎn)生了不便處理的代碼,因為數(shù)組在兩處進行了同一聲明。

賦值
Visual Basic 6.0
賦值形式有兩種:Let 賦值(默認)和 Set 賦值。用 Set 語句為 cn 賦值。
Visual Basic.NET
僅有一種賦值形式。x = y 意味著將變量或?qū)傩?y 的值賦給變量或?qū)傩?x。對象類型變量的值是對對象實例的引用,因此如果 x 和 y 是引用類型的變量,將執(zhí)行引用賦值。這種單一形式的賦值減少了語言的復雜性,并使代碼可讀性更強。

升級向?qū)?br>
刪除 Set 和 Let 語句。解析強類型對象的默認屬性,并將屬性顯式添加到代碼中。
有關(guān)該主題的全面說明,請參閱白皮書《準備將 Visual Basic 6.0 應用程序升級到 Visual Basic.NET》(英文)。

And、Or、Xor 和 Not
Visual Basic 6.0
And、Or、Xor 和 Not 運算符可以執(zhí)行邏輯運算或位運算(取決于表達式)。

Visual Basic.NET
And、Or 和 Xor 僅適用于布爾型。對于 And 和 Or 運算符,如果第一個運算數(shù)的值足以確定運算符的結(jié)果,則運算符將簡化計算。新的運算符 BitOr、BitAnd 和 BitXor 均用于位邏輯運算。Bitxxx 運算符不具有簡化作用。

升級向?qū)?br>
如果 And/Or 語句是非布爾型或者包含函數(shù)、方法或?qū)傩,此語句將升級為使用兼容性函數(shù),與 Visual Basic 6.0 中的表現(xiàn)形式相同。如果 And/Or 語句是布爾型,此語句將升級為使用本地 Visual Basic.Net 語句。
有關(guān)該主題的全面說明,請參閱白皮書《準備將 Visual Basic 6.0 應用程序升級到 Visual Basic.NET》(英文)。

運算符優(yōu)先級
Visual Basic 6.0
邏輯和位的 And、Or、Xor 和 Not 運算符的優(yōu)先級高于比較運算符。

Visual Basic.NET
And、Or、Xor 和 Not 運算符的優(yōu)先級低于比較運算符,因此 a > b And a < c 將被認為是 (a > b) And (a < c)。新的 BitAnd、BitOr 和 BitXor 運算符的優(yōu)先級高于比較運算符,因此 a BitAnd &HFFFF <> 0 將被認為是 ((a BitAnd &HFFFF) <> 0)。
由于 BitAnd、BitOr 和 BitNot 運算符可以返回數(shù)值結(jié)果,因此其優(yōu)先級高于關(guān)系運算符,這樣,就允許這三個運算符返回的結(jié)果與其他值進行比較。

升級向?qū)?br>
由升級向?qū)幚。有關(guān)該主題的全面說明,請參閱白皮書《準備將 Visual Basic 6.0 應用程序升級到 Visual Basic.NET》(英文)。

調(diào)用過程
Visual Basic 6.0
支持兩種類型的過程調(diào)用:一種使用 Call 語句,要求使用括號括住參數(shù)列表;另一種不使用 Call 語句,不能使用括號來括住參數(shù)列表。
在 Visual Basic 6.0 中的一種常見情況是,開發(fā)者調(diào)用的過程不使用關(guān)鍵字,而又在參數(shù)列表外使用括號。幸運的是,當有一個以上的參數(shù)時,編譯器會將其作為語法錯誤檢測出來。但是,當僅有一個參數(shù)時,單一參數(shù)外的括號會將參數(shù)變量傳遞為 ByVal 而不是 ByRef。這會導致難以找到的小錯誤。

Visual Basic.NET
在所有情況下參數(shù)列表均需要使用括號。

升級向?qū)?br>
為沒有使用括號的過程調(diào)用插入括號。

靜態(tài)過程
Visual Basic 6.0
通過 Static 關(guān)鍵字可以聲明過程,此關(guān)鍵字表明在調(diào)用之間保留過程的局部變量。

Visual Basic.NET
在過程中不支持 Static 關(guān)鍵字,并且所有的靜態(tài)局部變量均需通過 Static 語句顯式聲明。 需要將過程中的所有變量均聲明為靜態(tài)的情況很少。刪除此功能簡化了語言,并且提高了可讀性,因為局部變量總是位于堆棧中,除非已顯式聲明為 Static。

升級向?qū)?br>
如果過程標記為 Static,則所有的局部變量均變?yōu)?Static。

參數(shù)的 ByVal/ByRef 默認值
Visual Basic 6.0
參數(shù)未指定其默認值為 ByVal 或 ByRef 時,其默認值為 ByRef。

Visual Basic.NET
<參數(shù)未指定其默認值為 ByVal 或 ByRef 時,其默認值為 ByVal。
將參數(shù)默認值指定為 ByVal 而不指定為 ByRef,可以避免過程錯誤地修改由調(diào)用方傳遞的變量。這也使得默認的調(diào)用規(guī)則與賦值一致,以便參數(shù)有效地綁定至表達式(通過表達式賦值為正式參數(shù))。 請用戶注意避免由 Visual Basic 6.0 升級到 Visual Basic.NET 帶來的混亂。如果用戶輸入的參數(shù)聲明未顯式指定其默認值為 ByVal 或 ByRef,IDE 將為其自動添加 ByVal 關(guān)鍵字。

升級向?qū)?br>
為沒有指定 ByVal 或 ByRef 為默認值的參數(shù)添加 ByRef。

IsMissing 參數(shù)和可選參數(shù)
Visual Basic 6.0
沒有默認值的可選 Variant 參數(shù)將被初始化為特殊的錯誤代碼,此錯誤代碼可以由 IsMissing 函數(shù)檢測出來。

Visual Basic.NET
在 Visual Basic.NET 中要求所有的可選參數(shù)均指定默認值。這樣可以減少語言中特殊值的數(shù)量,從而簡化語言。

升級向?qū)?br>
IsMissing 函數(shù)由 IsNothing 函數(shù)代替,并且標記有升級警告注釋。

ParamArray 參數(shù)
Visual Basic 6.0
當變量傳遞給 ParamArray 參數(shù)時,可以通過被調(diào)用的函數(shù)修改。不支持 ByVal ParamArray 元素。

Visual Basic.NET
當變量傳遞給 ParamArray 參數(shù)時,不能通過被調(diào)用的函數(shù)修改。不支持 ByRef ParamArray 元素。
ParamArray 參數(shù)最常見的情況是不修改傳遞給此參數(shù)的變量。不支持 ByRef ParamArray 參數(shù)簡化了 ParamArray 調(diào)用規(guī)則,因為 ParamArray 參數(shù)將被指定為正常數(shù)組。這樣,ParamArray 參數(shù)可以擴展到任何元素類型,同時需要 ParamArray 參數(shù)的函數(shù)均可通過數(shù)組(而不是參數(shù)列表)直接調(diào)用。

升級向?qū)?br>
過程的 ParamArray 參數(shù)標記有升級警告。例如,以下代碼:
Function MyFunction(ParamArray p() As Variant)
'...
End Function
升級后將變?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,這樣對本地 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
這提高了類型的安全性,并減少了導致程序失敗的小毛病。這一情況的存在是因為編譯器不允許通過沒有顯式定義的數(shù)據(jù)類型來調(diào)用 API。

升級向?qū)?br>
使用 As Any 參數(shù)的 Declare 語句標記有升級警告。

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ū)?br>
如果類 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ū)?br>
如果訪問選項的級別不同,則新屬性為 Public。

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

Visual Basic.NET
只有接受參數(shù)的屬性可以標記為默認值。對于將成為集合中的索引的帶參數(shù)屬性,這一情況很常見。
這使得代碼的可讀性更強,因為對沒有成員的對象變量的引用通常指向?qū)ο笞陨,而不是指向上下文中的對象和其他上下文中的默認屬性。例如,語句 Call Display(TextBox1) 可能是將文本框?qū)嵗齻鬟f給 Display 函數(shù),也可能是傳遞文本框的內(nèi)容。
此外,刪除這種二義性避免了使用單獨的語句執(zhí)行引用賦值。賦值 x = y 總是意味著將變量 y 的內(nèi)容賦值給變量 x,而不是將 y 引用的對象的默認屬性賦值給 x 引用的對象的默認屬性。

升級向?qū)?br>
盡可能解析默認屬性。無法解析時(延遲綁定對象)將添加錯誤注釋。

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

Visual Basic.NET
如果在文件或項目級別為枚舉添加了 Import,則枚舉常數(shù)可以無限定引用。 這樣可以與類、結(jié)構(gòu)和接口保持一致,在類、結(jié)構(gòu)和接口中,可以給成員賦予通用名稱,而不必擔心與其他成員沖突。例如,Color 枚舉和 Fruit 枚舉均可以包含名稱為 Orange 的常數(shù)。在 Visual Basic 6.0 中的規(guī)則是,為枚舉常數(shù)加上前綴使每個常數(shù)保持唯一。這使常數(shù)名稱非常累贅,如 MsColorOrange 和 MsFruitOrange。

升級向?qū)?br>
對枚舉的引用將變?yōu)橥耆薅ā?br>
While
Visual Basic 6.0
While 語句以 WEnd 語句結(jié)束。

Visual Basic.NET
為了與其他塊結(jié)構(gòu)保持一致,While 的結(jié)束語句變?yōu)?End While。這提高了語言的一致性和可讀性。

升級向?qū)?br>
將 WEnd 語句變?yōu)?End While。

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

Visual Basic.NET
On...GoTo 和 On...GoSub 是非結(jié)構(gòu)化的編程構(gòu)造。它們的使用讓程序更加難以閱讀和理解。Select Case 可以提供一種更加結(jié)構(gòu)化和靈活的方法來執(zhí)行多個分支。
注意:仍然支持 On Error GoTo。

升級向?qū)?br>
以下示例:
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 是非結(jié)構(gòu)化編程構(gòu)造。它的使用讓程序更加難以閱讀和理解。一個更加結(jié)構(gòu)化的替代方案是:創(chuàng)建可以調(diào)用的獨立過程。

升級向?qū)?br>
與 On...GoTo 相同,這些語句均標記有升級錯誤。

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

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

升級向?qū)?br>
語句:
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 以整數(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ù)項目能夠改善運行時的性能。

升級向?qū)?br>
這些語句不會自動升級,因此將標記有“(statement) is not supported”[(語句)不被支持] 的升級錯誤。例如,以下代碼:
a = VarPtr(b)
升級后將變?yōu)椋?br>' UPGRADE_ISSUE: Function VarPtr() is not supported
a = VarPtr(b)
這也會導致編譯錯誤。

文件 I/O
Visual Basic 6.0
語言中包括文件 I/O 語句。

Visual Basic.NET
通過類庫使用文件 I/O 操作。從語言中刪除文件 I/O 語句以便在 Visual Basic.NET 中使用不同的 I/O 庫。如果語言中存在文件 I/O 語句,將會使代碼更加累贅,標識符 Open、Close、Print 和 Write 將成為保留字。

升級向?qū)?br>
文件 I/O 語句將升級為相應的函數(shù)。例如,以下代碼:
Open nput )

Debug.Print
Visual Basic 6.0
Debug.Print 將一行文字輸出到“立即”窗口。

Visual Basic.NET

Debug.WriteLine 將一行文字輸出到“輸出”窗口。還可以使用 Debug.Write 方法將文字輸出到“輸出”窗口,并且沒有換行符。

升級向?qū)?br>
Debug.Print 升級為 Debug.WriteLine。

資源文件
Visual Basic 6.0
Visual Basic 6.0 支持每個工程使用一個 .res 文件。

Visual Basic.NET
Visual Basic.NET 支持多種資源文件?梢越壎ù绑w以自動從新的 .resX 格式資源文件中檢索資源。任何 CLR 類均可存儲在 .resX 文件中。

升級向?qū)?br>
文件由 .res 升級為 .resX,并且代碼被修改以便從 .resX 文件中加載。

Windows 應用程序
Visual Basic 窗體
Visual Basic 6.0
Visual Basic 6.0 具有自己的窗體包,用于創(chuàng)建圖形 Windows 應用程序。

Visual Basic.NET
對于 Visual Basic.NET,Windows 窗體是一種新的窗體包。由于 Windows 窗體是以公共語言運行時 (CLR) 為目標構(gòu)造的,因此 Windows 窗體可以充分利用 CLR 的全部功能。特別是,由于 Windows 窗體包具有部署、應用程序分離、版本和代碼訪問安全特性方面的優(yōu)勢,您現(xiàn)在可以構(gòu)造基于 Windows 的客戶端應用程序,其部署和更新明顯更加簡易。您甚至可以構(gòu)造與 HTML 具有相同瀏覽器部署方案的 Windows 窗體應用程序。正如代碼訪問安全性的粒度控制一樣,這些特性也使得在瀏覽器中使用 Windows 窗體控件非常令人矚目。
Windows 窗體集還為 Visual Basic 開發(fā)者提供了許多新功能,例如可視化繼承、改進的本地化和訪問支持、自動調(diào)整窗體大小和就地菜單編輯器。

升級向?qū)?br>
將 Visual Basic 窗體升級為 Windows 窗體。

PrintForm 方法
Visual Basic 6.0
PrintForm 方法將 Form 對象的圖象一個字節(jié)一個字節(jié)地發(fā)送至打印機。但是,此打印功能在某些窗體中無法正常工作。

Visual Basic.NET
在 Windows 窗體中,Visual Basic.NET 采用的打印框架使您可以快速生成復雜的打印文檔。它還包括內(nèi)置的“打印預覽”對話框。

升級向?qū)?br>
PrintForm 方法調(diào)用標記有升級錯誤。您可以使用新的打印框架創(chuàng)建打印文檔,甚至可以拍下應用程序窗口的屏幕快照并進行打印。

Circle、Cls、PSet、Line 和 Point 方法
Visual Basic 6.0
通過 Circle、Cls、PSet、Line 和 Point 方法,您可以在窗體中繪圖,也可以清除這些圖象。

Visual Basic.NET
Windows 窗體具有一套新的圖形命令,用于替換 Circle、Cls、PSet、Line 和 Point。Windows 窗體包是在 GDI+ 的基礎(chǔ)上構(gòu)建的。GDI+ 是功能豐富的二維文字和圖象處理圖形庫,現(xiàn)在可以直接在 Visual Basic.NET 中使用。在以前的版本中,如果不通過 Declare 語句和 GDI API,Visual Basic 程序員無法使用這些功能。雖然這一轉(zhuǎn)變比較大,但是 GDI+ 的靈活性和強大功能讓程序員能夠快速開發(fā)應用程序,而使用以前版本的 Visual Basic 將會花費多得多的工作量。

升級向?qū)?br>
對這些方法的調(diào)用標記有升級錯誤。您可以在 System.Drawing 中記下使用 GDI+ 類的圖形調(diào)用。

Name 屬性
Visual Basic 6.0
Name 屬性返回代碼中使用的名稱以識別窗體、控件或數(shù)據(jù)訪問對象。在運行時為只讀。

Visual Basic.NET
在運行時 Windows 窗體不支持窗體和控件的 Name 屬性。如果需要迭代 Controls 集合以查找某一名稱的控件,您可以使用 .NET 框架的 System.Reflection 類進行查找。

升級向?qū)?br>
控件的 Name 屬性將標記有升級錯誤。

Caption 屬性
Visual Basic 6.0
某些控件(例如 Label)具有 Caption 屬性,用于確定在控件中或控件旁邊顯示的文字。其他控件(例如 TextBox)具有 Text 屬性,用于確定控件中包含的文字。

Visual Basic.NET
在 Windows 窗體中,對于所有控件,用于顯示控件中文字的屬性均統(tǒng)一稱為 Text。這簡化了控件的使用。

升級向?qū)?br>
將控件的 Caption 屬性變?yōu)?Text。

Tag 屬性
Visual Basic 6.0
Tag 屬性可以返回或設置用于存儲程序所需額外數(shù)據(jù)的表達式。
在 Visual Basic 6.0 中無法擴展內(nèi)置控件,所以 Tag 屬性是必需的。

Visual Basic.NET
在 Windows 窗體中,您可以使用繼承來擴展內(nèi)置控件,并添加自己的屬性。將繼承作為工具使用明顯使內(nèi)置控件更加靈活。您不僅可以根據(jù)需要添加任意多種屬性,還可以將這些屬性設為強屬性。

升級向?qū)?br>
兼容庫中的 Windows 窗體擴展程序 Tag 控件用于提供相同的功能。

ScaleMode 屬性
Visual Basic 6.0
ScaleMode 屬性返回或設置一個值,以在使用圖形方法或定位控件時表明對象的坐標度量單位。

Visual Basic.NET
Windows 窗體始終使用象素作為度量單位,簡化了窗體布局。
此外,Windows 窗體使用更好的方法來調(diào)整大小。AutoScaleBaseSize 屬性根據(jù)屏幕的分辨率 (dpi) 和使用的字體大小自動調(diào)整縮放比例。

升級向?qū)?br>
使用“twip”(緹)(Visual Basic 6.0 中 ScaleMode 的默認設置)的代碼將完全升級。如果 ScaleMode 為非緹,您將遇到調(diào)整大小方面的問題。
有關(guān)該主題的全面說明,請參閱白皮書《準備將 Visual Basic 6.0 應用程序升級到 Visual Basic.NET》(英文)。

字體
Visual Basic 6.0
窗體和控件可以使用任何 Windows 字體。

Visual Basic.NET
窗體和控件只能使用 TrueType 或 OpenType 字體。使用這些類型的字體可以解決不同操作系統(tǒng)版本及其本地化版本之間的許多不一致性問題。這些字體還具有不依賴設備分辨率和反走樣等功能。

升級向?qū)?br>
如果在應用程序中使用非 TrueType 字體,這些字體將變?yōu)槟J的 Windows 窗體字體,但其格式(大小、粗體、斜體和下劃線)將會丟失。

Screen.MousePointer 屬性
Visual Basic 6.0
Screen 對象的 MousePointer 屬性可以返回或設置一個值,以表明運行時鼠標在應用程序窗體外部顯示的鼠標指針類型。

Visual Basic.NET
如果鼠標指針位于應用程序內(nèi)部的窗體中,則可以進行操作;當其位于應用程序外時則不能。在今后的版本中我們將繼續(xù)完善其功能。

升級向?qū)?br>
使用 Screen.MousePointer 的語句標記有升級錯誤。

Timer.Interval 屬性
Visual Basic 6.0
Timer 控件的 Interval 屬性返回或設置 Timer 事件調(diào)用之間的毫秒數(shù)。如果設置為 0,則禁用 Timer 控件。Enabled 屬性還用于確定計時器是否在運行。這將引起混亂,因為即使 Enabled 屬性為 True,如果時間間隔為 0,仍不能啟用計時器。

Visual Basic.NET
Interval 屬性表明計時器刻度之間的時間(以毫秒為單位)。此屬性不能設置為 0。Enabled 屬性指定計時器是否在運行。這一方式更加直接,可以簡化 Timer 對象的編碼。

升級向?qū)?br>
如果 Timer.Interval 設置為 0,升級向?qū)軌驒z測到這一情況,并為 Timer.Interval 標記升級錯誤。
建議您在 Visual Basic 6.0 應用程序中使用 Timer.Enabled,因為此屬性可以順利升級。

控件數(shù)組
Visual Basic 6.0
控件數(shù)組是一組共享同一名稱和類型的控件。它們也共享同一事件過程?丶䲠(shù)組至少有一個元素,只要您的系統(tǒng)資源和內(nèi)存允許,它可以有任意多個元素。同一控件數(shù)組的元素具有各自的屬性設置。

Visual Basic.NET
Windows 窗體體系結(jié)構(gòu)可以處理使用控制數(shù)組的多種方案。例如,在 Windows 窗體中可以通過單一事件句柄處理多個控件的多個事件。

升級向?qū)?br>
兼容庫中的“控件數(shù)組 Windows 窗體”擴展程序控件提供了這種功能。

Menu 控件
Visual Basic 6.0
Menu 控件代表菜單樹中的各個項目。同一 Menu 控件實例可以同時在主菜單或上下文菜單中使用。

Visual Basic.NET
MenuItem 控件代表菜單樹中的各個項目。MenuItem 控件可以添加至 MainMenu 項目或 ContextMenu 項目,但不能同時添加。要在 MainMenu 對象和 ContextMenu 對象中共享菜單,可以在 MenuItem 中使用 CloneMenu 方法創(chuàng)建菜單副本。

升級向?qū)?br>
使用上下文菜單的代碼將標記有升級錯誤?梢允褂 MenuItem.CloneMenu 創(chuàng)建 MainMenu 項目的副本,用作 ContextMenu 項目。

OLE 容器控件
Visual Basic 6.0
OLE 容器控件使您可以將 OLE 對象添加至窗體。

Visual Basic.NET
Visual Basic.NET 中沒有 OLE 容器控件。如果需要與 OLE 容器控件相當?shù)目丶,可以?WebBrowser 控件添加至窗體,并將其用作 OLE 容器控件。

升級向?qū)?br>
在升級報告中報告此升級錯誤,并在窗體中放置不受支持控件的占位符。

Image 控件
Visual Basic 6.0
Image 和 PictureBox 控件均可顯示位圖、圖標、圖元文件、增強型圖元文件、JPEG 或 GIF 文件的圖形。

Visual Basic.NET
Visual Basic.NET 中的 PictureBox 控件代替了 Visual Basic 6.0 中的 PictureBox 和 Image 控件。Windows 窗體中的 PictureBox 控件還支持動態(tài) GIF 文件。但是,如果您需要一個簡單方案,以便在窗體中繪制圖象,您也可以不使用窗體的 OnPaint 事件,而使用 DrawImage 方法。

升級向?qū)?br>
Image 控件變?yōu)?PictureBox 控件。

Line 和 Shape 控件
Visual Basic 6.0
Line 控件顯示水平線、垂直線或?qū)蔷。Shape 控件顯示矩形、正方形、橢圓形、圓形、圓角矩形或圓角正方形。

Visual Basic.NET
System.Drawing 中的 GDI+ 類代替了 Line 和 Shape 控件。要在窗體中繪制各種形狀的圖形,請不要使用 OnPaint 事件,而使用 GDI+ Draw 方法繪制圓、正方形等各種形狀。

升級向?qū)?br>
水平和垂直 Line 控件變?yōu)?Label 控件(沒有文字,高度或?qū)挾仍O置為 1)。對角線控件在升級報告中報告有升級錯誤,并在窗體中放置不受支持控件的占位符。
矩形和正方形 Shape 控件變?yōu)?Label 控件。其他 Shape 控件在升級報告中報告有升級錯誤,并在窗體中放置不受支持控件的占位符。

Windowless 控件
Visual Basic 6.0
輕便控件,有時稱為無窗口的控件,與常規(guī)控件最顯著區(qū)別是:沒有窗口句柄(hWnd 屬性)。因此,它們使用的系統(tǒng)資源較少。您可以在設計時將 Windowless 屬性設置為 True 以創(chuàng)建輕便用戶控件。輕便用戶控件只能包含其他輕便用戶控件。并非所有容器均支持輕便控件。

Visual Basic.NET
在 Windows 窗體中,大多數(shù)無窗口控件默認在窗口中使用。使用無窗口控件的主要優(yōu)點是:當窗體中有非常大量的控件時,可以減少資源消耗(窗口句柄)。這僅限于 Windows 9x。Microsoft Windows NT? 和 Microsoft Windows 2000 沒有這種資源限制。
使用無窗口控件也有缺點(如分層等布局問題),但 Microsoft 認識到了無窗口控件的作用,并將發(fā)布示例來展示如何在 Windows 窗體中獲得類似效果。

升級向?qū)?br>
無需特別處理。

Clipboard
Visual Basic 6.0
Clipboard 對象提供了對系統(tǒng)剪貼板的訪問。

Visual Basic.NET
Clipboard 類提供了在系統(tǒng)剪貼板上放置數(shù)據(jù)和從其上檢索數(shù)據(jù)的方法。新的 Clipboard 類提供了更多功能,并且支持的剪貼板格式比 Visual Basic 6.0 Clipboard 對象更多。對象模塊經(jīng)過了重新構(gòu)建以支持這些功能。

升級向?qū)?br>
由于對象模塊之間的差異,現(xiàn)有的剪貼板代碼無法自動升級。Clipboard 語句將標記有升級錯誤。

動態(tài)數(shù)據(jù)交換
Visual Basic 6.0
某些控件具有支持動態(tài)數(shù)據(jù)交換 (DDE) 會話的屬性和方法。

Visual Basic.NET
Windows 窗體不支持內(nèi)置 DDE。

升級向?qū)?br>
DDE 屬性和方法標記有升級警告。

Web 應用程序
WebClass
Visual Basic 6.0
WebClass 是駐留在 Web 服務器上的 Visual Basic 組件,能夠響應瀏覽器的輸入。WebClass 通常包括 WebItems,用于為瀏覽器和公開事件提供內(nèi)容。

Visual Basic.NET
Web 窗體具有 .NET 框架功能,可以用來為 Web 應用程序創(chuàng)建基于瀏覽器的用戶界面。Visual Basic.NET 具有“所見即所得”的設計器,可以使用工具箱中的控件創(chuàng)建圖形 Web 窗體。這樣,Web 用戶界面開發(fā)與 Windows 開發(fā)具有同樣的形式。此外,當創(chuàng)建項目后,Internet Information Services (IIS) 服務器不必停止并重新啟動即可開始部署新內(nèi)容,而使用 WebClass 則不能。

升級向?qū)?br>
WebClass 將升級為 Web 窗體。所有狀態(tài)存儲調(diào)用均標記有升級警告?梢灾匦戮帉戇@些代碼,以使用 ASP.NET 狀態(tài)管理的優(yōu)勢。
您也可以選擇繼續(xù)使用 Visual Basic 6.0 中的 WebClass 應用程序,從 Visual Basic.NET Web 窗體中定位至 WebClass 和 WebForm,等等。

ActiveX 文檔和 DHTML 應用程序
Visual Basic 6.0
ActiveX 文檔在 Internet 瀏覽器窗口中顯示,并提供內(nèi)置的視區(qū)滾動、超鏈接和菜單協(xié)商。DHTML 應用程序包含 DHTML 頁面和客戶端 ActiveX DLL。

Visual Basic.NET
Web 窗體通過采用 HTML 以支持多種應用程序。通過使用寄存在瀏覽器中的 Windows 窗體控件或已下載的“安全 Windows 窗體”EXE,它能夠以更安全的方式支持多種應用程序。此代碼在安全沙箱中運行,因此不會對用戶的計算機造成損害。

升級向?qū)?br>
雖然 ActiveX 文檔和 DHTML 應用程序無法直接升級,您仍可以在 ActiveX 文檔、DHTML 應用程序和 Web 窗體之間切換。

數(shù)據(jù)
ADO、RDO 和 DAO 代碼
Visual Basic 6.0
ActiveX 數(shù)據(jù)對象 (ADO)、遠程數(shù)據(jù)對象 (RDO) 和數(shù)據(jù)訪問對象 (DAO) 用于連接和斷開數(shù)據(jù)訪問。

Visual Basic.NET
ADO.NET 提供了斷開數(shù)據(jù)訪問的其他類。與用于分布式應用程序的較早版本 ADO 相比,這些類提供了更好的性能和可伸縮性。它們也使 XML 數(shù)據(jù)與數(shù)據(jù)庫數(shù)據(jù)的集成更加簡單。

升級

Visual Basic.NET 代碼中仍然可以使用 ADO、RDO 和 DAO。

ADO、RDO 和 DAO 數(shù)據(jù)綁定
Visual Basic 6.0
Visual Basic 窗體中的控件可以綁定到 ActiveX? 數(shù)據(jù)對象 (ADO)、遠程數(shù)據(jù)對象 (RDO) 和數(shù)據(jù)訪問對象 (DAO) 數(shù)據(jù)源。

Visual Basic.NET
ADO.NET 為 Windows 窗體控件提供了讀/寫數(shù)據(jù)綁定,為 Web 窗體提供了只讀數(shù)據(jù)綁定。

升級向?qū)?br>
ADO 數(shù)據(jù)綁定升級為新的 ADO.NET 數(shù)據(jù)綁定。但是,RDO 和 DAO 數(shù)據(jù)綁定無法升級,將會在升級報告中報告升級錯誤。

IDE
“立即”窗口
Visual Basic 6.0
在設計模式的“立即”窗口,您可以運行部分代碼,而不必通過其 Startup 對象啟動整個應用程序。例如,可以顯示窗體、調(diào)用模塊過程以及與全局變量交互。這是因為 Visual Basic 6.0 是從代碼的內(nèi)存映象運行,而不是調(diào)試運行時使用的已創(chuàng)建輸出。

Visual Basic.NET
可以從設計模式的“命令”窗口中執(zhí)行 IDE 命令,但是不能運行應用程序的各個部分。這是因為 Visual Basic.NET 的運行和調(diào)試所使用的是運行時的實際輸出。這種形式的調(diào)試最精確地再現(xiàn)了運行時的行為。

IDE 和項目擴展性
Visual Basic 6.0
只有 Visual Basic 6.0 支持 Visual Basic 6.0 集成開發(fā)環(huán)境 (IDE) 擴展模型。

Visual Basic.NET
對于 Visual Studio.NET 中的所有工程類型,新的 IDE 擴展模型是通用的。這使得創(chuàng)建與多種不同類型工程協(xié)作的外接程序更加簡單。Visual Basic 工程系統(tǒng)擴展模型也可以與 C# 共享,因此工程的特定功能(例如添加引用或更改工程屬性)在兩種語言中的用法相同。
Visual Studio.NET 代碼模型也給擴展級編寫者提供了公共對象模型,以編寫跨不同語言工程使用的代碼。Visual Basic 支持通過代碼模型讀取代碼。要編寫代碼,您可以從模型中取出一個插入點,然后寫入 Visual Basic 語法。
    (llm9178整理)