天天看點

vb6 轉 vb.net

從 Visual Basic 6.0 到 Visual Basic.NET 的轉換(1)

Microsoft Visual Basic.NET 是 Microsoft Visual Basic? 的後續版本,它是基于 .NET 架構重新設計的,您可以用它來輕松地建立用于 Microsoft Windows? 作業系統和 Web 的下一代應用程式。使用 Visual Basic.NET,可視化開發 Web 應用程式、Web 服務、Windows 應用程式和伺服器端元件将變得輕而易舉。此外,Visual Basic.NET 使用了 Windows 應用程式的 XCOPY 部署方案,使您不必再擔心 DLL 版本問題。随着 Visual Basic.NET 的釋出,“DLL 噩夢”将成為過去。

在設計 Visual Basic.NET 時,我們着眼于世界各地 Visual Basic 開發者的要求。Visual Basic 語言現在是真正的面向對象語言,并支援實作繼承。窗體設計器支援可視化繼承,并包含窗體自動調整大小、資源本地化和通路選項支援等新特性。現在的資料工具繼續支援 XML 資料,并可以共同使用設計時資料綁定和斷開資料。此外,Visual Basic.NET 是基于 .NET 架構直接建立的,是以可以使用所有的平台特性,并能夠與其他 .NET 語言協同工作。

在釋出這些功能的同時,我們對産品的幾個方面作了修改。本文檔介紹了從 Visual Basic 6.0 到 Visual Basic.NET 的一些變更,并解釋了進行這些變更的原因。本文還介紹 Visual Basic.NET 更新向導的功能。它是作為産品的一部分提供的工具,可以幫助您将現有的應用程式更新為 Visual Basic.NET 版本。

有關從 Visual Basic 6.0 更新到 Visual Basic.NET 的其他資訊,請參閱白皮書《準備将 Visual Basic 6.0 應用程式更新到 Visual Basic.NET》(英文)。此白皮書介紹了更新過程并提供了盡可能順利更新的建設性意見。

語言

Variant

Visual

Basic 6.0 Variant 是一種特殊的“通用”資料類型,可以包含除定長字元串之外的各類資料。Object 變量用作指向對象的指針。預設的資料類型為 Variant。

Visual Basic.NET

公共語言運作時 (CLR) 使用 Object 作為通用資料類型。Visual Basic.NET 沒有繼續使用 Variant 作為通用資料類型,而是選擇采用 CLR 命名規則,以避免在跨語言開發時造成混亂。僅使用一種通用資料類型将簡化類型系統。預設的資料類型為 Object。

更新

向導

将 Variant 資料類型變為 Object,是以以下代碼:

Dim x As Variant

更新後将變為:

Dim x As Object

Integer 和 Long

Visual

Basic 6.0 Long 變量存儲為帶有符号的 32 位數字,而 Integer 變量存儲為 16 位數字。

Visual Basic.NET

Long 變量存儲為帶有符号的 64 位數字,Integer 變量存儲為 32 位數字,而 Short 變量存儲為 16 位數字。在 32 位系統中,32 位整數操作比 16 位和 64 位整數操作都要快。這意味着 Integer 将是最有效和最基本的數字類型。

由于部分 .NET 架構技術以現代的 32 位和 64 位技術為基礎,是以根據新技術更新資料大小是明智之舉。

更新

向導

修改變量的類型,是以以下代碼:

Dim x As IntegerDim y As Long

更新後将變為:

Dim x As ShortDim y As Integer

Currency

Visual

Basic 6.0 Visual Basic 6.0 支援 Currency 資料類型。您不能将變量聲明為 Decimal 類型(雖然變量可以具有子類型 Decimal)。

Currency 變量以整數格式存儲為 64 位數字,以 10,000 為标度,以将數字表示為定點數,其小數點左邊為 15 位,右邊為 4 位。這種表示形式可以表示 -922,337,203,685,477.5808 至 922,337,203,685,477.5807 範圍内的數字。

Decimal 變量存儲為帶有符号的 96 位整數,标度為 10 的不同乘幂。10 次幂的刻度因子指定了小數點右邊的數字位數,其範圍為 0 至 28。當指數為 0 時(無小數位數),最大的可能值為 +/-79,228,162,514,264,337,593,543,950,335。當指數為 28 時,最大值為 +/-7.9228162514264337593543950335,最小的非零值為 +/-0.0000000000000000000000000001。

Visual Basic.NET

Currency 資料類型的精度不夠,無法避免四舍五入的誤差,是以建立了 Decimal 這種資料類型.

更新

向導

将 Currency 資料類型轉換為 Decimal,是以以下代碼:

Dim x As Currency

更新後将變為:

Dim x As Decimal

Date

Visual

Basic 6.0 Date 變量在内部以 Double 格式存儲,能夠作為 Double 類型的變量操作。

Date 變量存儲為 IEEE 64 位浮點數,表示從 100 年 1 月 1 日到 9999 年 12 月 31 日的日期和從 0:00:00 到 23:59:59 的時間。任何可識别的文字日期都可以指定為 Date 變量。

當其他數字類型轉換為 Date 時,小數點左邊的值表示日期資訊,而小數點右邊的值表示時間資訊。午夜為 0,正午為 0.5。整個數值為負表示 1899 年 12 月 30 日之前的日期。

Visual Basic.NET

Date 在内部存儲為 64 位整數,是以無法直接作為 Double 進行操作。.NET 架構提供了 ToOADate 和 FromOADate 函數以進行 Double 和 Date 之間的轉換。将日期表示為整數形式可以簡化并加速對日期的操作。

更新

向導

更新工具并非能夠檢測到所有使用變量将 Date 存儲為 Double 的情況,但它一般會在将 Double 指定為 Date 的位置插入适當的 ToOADate 或 FromOADate 方法。例如,以下代碼:

Dim dbl As Double Dim dat As Date Dbl = dat

更新後将變為:

Dim dbl As Double Dim dat As Date Dbl = dat.ToOADate

定長字元串

Visual

Basic 6.0 除類子產品的 Public 變量之外,其他變量均可以聲明為定長字元串。

Visual Basic.NET

CLR 第一版不支援定長字元串。在後續版本中将添加這一支援功能。

更新

向導

在大多數情況下不會出現問題。假設為定長字元串表現方式,則以下代碼:

Dim MyFixedLengthString As String * 100

更新後将變為:

Dim MyFixedLengthString As New VB6.FixedLengthString(100)

有關該主題的全面說明,請參閱白皮書《準備将 Visual Basic 6.0 應用程式更新到 Visual Basic.NET》(英文)。

Type

Visual

Basic 6.0

Type 語句用于定義由使用者定義的資料類型。

Visual Basic.NET

Type 和 User-Defined Type 這兩個名稱會引起混淆,因為類、枚舉和接口也是可以由使用者定義的類型。Type 和 User-Defined Type 是從 QuickBasic 遺留下來的,在 QuickBasic 中使用者可以定義的類型隻有結構和記錄。CLR 使用 Type 這一名稱廣義地包含所有資料類型。

是以,在 Visual Basic.NET 中 Type 語句将變為 Structure。

更新

向導

将 Type 語句變為 Structure,是以以下代碼:

Type MyType MyVariable As Integer End Type

更新後将變為:

Structure MyType Dim MyVariable As Short End Structure

使用者定義類型存儲

Visual

Basic 6.0 使用者定義的資料類型可以包含某種資料類型、數組或先前定義的使用者定義類型的一個或多個元素。在 Visual Basic 6.0 中,它們存儲在連續的記憶體塊中。

Visual Basic.NET

格式是最有效的。它可能位于一段連續的記憶體,也可能不。結構可以被标記為封送處理屬性,以確定能夠作為連續記憶體塊傳遞到 COM 元件。

更新

向導

在所有需要添加封送處理屬性的位置,API 均标記有 TODO 注釋。(屬性不是自動添加的,隻有将結構傳遞到 API 時才需要它們。)

True

Visual

Basic 6.0 True 的值為 -1。

Visual Basic.NET

True 的值為 1。

鑒于語言的協同操作,需要一種适用于所有語言的一緻表示法。

更新向導

如果将布爾值強制轉換為非布爾值,代碼将标記有更新警告。例如,以下代碼:

Dim MyBoolean As BooleanDim MyInteger As Integer MyInteger = MyBoolean

更新後将變為:

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,當用于數值表達式時,變量将自動轉換為零,當用于字元串表達式時,則自動轉換為空字元串。

Visual Basic.NET

對象變量均初始化為 Nothing,當用于數值表達式時,變量将自動轉換為零,當用于字元串表達式時,将自動轉換為空字元串。使用 Nothing 代替特殊的 Empty 值可以降低語言的複雜性,語言協同操作性也更強。

更新向導

Null 和 Null 傳播

Visual

Basic 6.0 Null 值為 Variant 的子類型,表示變量不包含有效資料。Null 值通過表達式和函數“傳播”。如果表達式的任一部分為 Null,則整個表達式為 Null。将 Null 作為參數傳遞給大多數函數時,這些函數也将傳回 Null。

Visual Basic.NET

不支援 Null 傳播。使用 ADO.NET 對資料進行程式設計的模型用于在檢索字段的值之前先檢查字段的值是否為 Null。包含 null 的變量将作為 DBNull 類型的對象封送處理至 CLR。

Visual Basic.NET 處理 Null 時更加直接:字元串函數(例如 Left())總是傳回字元串,與您的預期一樣。

更新向導

Null 值和 IsNull 函數标記有更新警告注釋。例如,以下代碼:

If x Is Null Then MsgBox "Null"

更新後将變為:

' 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 語句用于在子產品級設定變量、參數和過程傳回類型(以指定字元開始)的預設資料類型。

Visual Basic.NET

避免使用隐式類型聲明,提高了代碼的可讀性和可靠性。

更新向導

将變量類型的顯式聲明插入代碼。例如,以下代碼:

DefStr a-z

Sub MySub

s = "Hello"

End Sub

更新後将變為:

Sub MySub

Dim s As String

s = "Hello"

End Sub

塊内的局部變量

Visual

Basic 6.0 從包含聲明的行至過程結束的範圍内,局部變量均可見。

Visual Basic.NET

Visual Basic.NET 支援變量的塊範圍。這意味着從包含聲明的行開始,至出現聲明的塊結束,局部變量均可見。例如:

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 控制結構之外聲明該變量。

變量的塊範圍是許多結構語言共有的功能。過程局部變量允許定義過程内部變量,進而對結構化程式設計提供支援,與此類似,塊級别變量允許定義代碼塊内部變量,進而對結構化分解提供支援。

更新向導

如果變量在塊内聲明,變量将自動移至子產品級範圍。例如,以下代碼:

If x =1 Then

Dim y As Integer

End If

更新後将變為:

Dim y As Integer

If x =1 Then

End If

新的自動重新執行個體化

Visual

Basic 6.0 窗體的類變量聲明 Dim x As New <classname> 将導緻編譯器每次引用 x 時生成代碼。此代碼檢查 x 是否為 Nothing;如果是 Nothing,則建立類的新執行個體。例如,以下代碼:

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()

即使變量已經設定為 Nothing,在下一次調用時該變量仍将重新執行個體化。

Visual Basic.NET

窗體的變量聲明 Dim x As New <classname> 等同于 Dim x As <classname> = New <classname>。引用通過此文法聲明的變量不會生成特殊代碼。

Visual Basic.NET 聲明 As New 比 Visual Basic 6.0 中的同一聲明更加有效。大多數對這類變量的引用不需要額外的開銷。而且,Visual Basic 6.0 的“自動執行個體化”行為對于發現它的許多程式設計人員來說非常古怪。

更新

向導

這極少會成為問題。但是,如果代碼嘗試使用已設定為 Nothing 的類,将導緻運作時異常。該異常很容易檢測到。然後,可以友善地修改代碼以執行個體化類的新版本,如下例所示:

Dim x As New MyClass

x = Nothing

x = New MyClass

對象終結

Visual

Basic 6.0 COM 引用計數機制用于垃圾回收對象執行個體。如果對象不在循環中,當對象不再使用,引用計數會立即檢測到此情況,并且運作終結代碼。

Visual Basic.NET

跟蹤垃圾回收器從存儲在堆棧變量、子產品變量和共享變量中的可及引用開始,将對象過一遍。此跟蹤程序作為背景任務運作,是以在指向對象的最後一個引用結束和添加新引用之間有一個不定的時間段。

在某些情況下,用戶端确實需要能夠強制某一對象釋放資源。CLR 規定這樣的對象應當實作 IDisposable 接口,這就提供了 Dispose 方法。當用戶端結束對具有 Dispose 方法的對象的使用時,它可以顯式調用 Dispose 方法以釋放其資源。例如,包裝資料庫連接配接的對象應當公開 Dispose 方法。

跟蹤垃圾回收器能夠正确釋放引用循環中的對象。此外,跟蹤垃圾回收器的性能比引用計數要好得多。

更新

向導

在大多數情況下,這一改變不會導緻問題。如果您的代碼中使用了資源句柄開放(連接配接或檔案句柄),則必須顯式關閉此句柄。此問題易于檢測并會導緻運作時錯誤。

數組

Visual

Basic 6.0 數組可以由任何整數數字的上下限限定。如果在聲明中未指定下限,将使用 Option Base 語句确定預設下限。

Visual Basic.NET

為了與其他語言協同操作,所有數組的下限均必須為零。這樣就不再需要 Option Base 語句。

更新

向導

ReDim

Visual

Basic 6.0 Visual Basic 6.0 中的固定大小數組和不定大小數組有所差別。固定大小數組通過 Dim 語句聲明,在此語句包括此聲明中的數組界限。動态數組在 Dim 語句中聲明,不指定界限資訊。在使用動态數組之前,需要通過 ReDim 語句重新标注動态數組。在 Visual Basic 6.0 中,ReDim 語句提供了在單個語句中為動态數組聲明和配置設定空間的快捷方法。ReDim 語句是 Visual Basic 6.0 中唯一能夠同時聲明和初始化變量的語句。

Visual Basic.NET

ReDim 語句僅用于為數組配置設定或重新配置設定空間,而不能用于重新配置設定數組。這是因為 Visual Basic.NET 中的所有數組均是動态的,在 Visual Basic.NET 中 Dim 語句既可用于聲明動态數組,又可用于初始化動态數組。

由于所有變量聲明均可聲明變量并指定變量的初始值,使用 ReDim 同時聲明和初始化變量就變得多餘和不必要了。隻需要 Dim 語句聲明變量使語言更加簡單、一緻性更高。

更新

向導

如果 ReDim() 用于聲明數組,在代碼中會自動插入相應的聲明。但是,最好的方法是您自己先在數組中插入 Dim 語句,因為使用 ReDim 聲明數組需要更新工具來推斷正确的聲明。使用 ReDim 也産生了不便處理的代碼,因為數組在兩處進行了同一聲明。

指派

Visual

Basic 6.0 指派形式有兩種:Let 指派(預設)和 Set 指派。用 Set 語句為 cn 指派。

Visual Basic.NET

僅有一種指派形式。x = y 意味着将變量或屬性 y 的值賦給變量或屬性 x。對象類型變量的值是對對象執行個體的引用,是以如果 x 和 y 是引用類型的變量,将執行引用指派。這種單一形式的指派減少了語言的複雜性,并使代碼可讀性更強。

更新向導

删除 Set 和 Let 語句。解析強類型對象的預設屬性,并将屬性顯式添加到代碼中。

有關該主題的全面說明,請參閱白皮書《準備将 Visual Basic 6.0 應用程式更新到 Visual Basic.NET》(英文)。

And、Or、Xor 和 Not

Visual

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

Visual Basic.NET

And、Or 和 Xor 僅适用于布爾型。對于 And 和 Or 運算符,如果第一個運算數的值足以确定運算符的結果,則運算符将簡化計算。新的運算符 BitOr、BitAnd 和 BitXor 均用于位邏輯運算。Bitxxx 運算符不具有簡化作用。

更新

向導

如果 And/Or 語句是非布爾型或者包含函數、方法或屬性,此語句将更新為使用相容性函數,與 Visual Basic 6.0 中的表現形式相同。如果 And/Or 語句是布爾型,此語句将更新為使用本地 Visual Basic.Net 語句。

有關該主題的全面說明,請參閱白皮書《準備将 Visual Basic 6.0 應用程式更新到 Visual Basic.NET》(英文)。

運算符優先級

Visual

Basic 6.0 邏輯和位的 And、Or、Xor 和 Not 運算符的優先級高于比較運算符。

Visual Basic.NET

And、Or、Xor 和 Not 運算符的優先級低于比較運算符,是以 a > b And a < c 将被認為是 (a > b) And (a < c)。新的 BitAnd、BitOr 和 BitXor 運算符的優先級高于比較運算符,是以 a BitAnd &HFFFF <> 0 将被認為是 ((a BitAnd &HFFFF) <> 0)。

由于 BitAnd、BitOr 和 BitNot 運算符可以傳回數值結果,是以其優先級高于關系運算符,這樣,就允許這三個運算符傳回的結果與其他值進行比較。

更新

向導

由更新向導處理。有關該主題的全面說明,請參閱白皮書《準備将 Visual Basic 6.0 應用程式更新到 Visual Basic.NET》(英文)。

調用過程

Visual

Basic 6.0 支援兩種類型的過程調用:一種使用 Call 語句,要求使用括号包覆參數清單;另一種不使用 Call 語句,不能使用括号來包覆參數清單。

在 Visual Basic 6.0 中的一種常見情況是,開發者調用的過程不使用關鍵字,而又在參數清單外使用括号。幸運的是,當有一個以上的參數時,編譯器會将其作為文法錯誤檢測出來。但是,當僅有一個參數時,單一參數外的括号會将參數變量傳遞為 ByVal 而不是 ByRef。這會導緻難以找到的小錯誤。

Visual Basic.NET

在所有情況下參數清單均需要使用括号。

更新向導

為沒有使用括号的過程調用插入括号。

靜态過程

Visual

Basic 6.0 通過 Static 關鍵字可以聲明過程,此關鍵字表明在調用之間保留過程的局部變量。

Visual Basic.NET

在過程中不支援 Static 關鍵字,并且所有的靜态局部變量均需通過 Static 語句顯式聲明。

需要将過程中的所有變量均聲明為靜态的情況很少。删除此功能簡化了語言,并且提高了可讀性,因為局部變量總是位于堆棧中,除非已顯式聲明為 Static。

更新

向導

如果過程标記為 Static,則所有的局部變量均變為 Static。

參數的 ByVal/ByRef 預設值

Visual

Basic 6.0 參數未指定其預設值為 ByVal 或 ByRef 時,其預設值為 ByRef。

Visual Basic.NET

<參數未指定其預設值為 ByVal 或 ByRef 時,其預設值為 ByVal。

将參數預設值指定為 ByVal 而不指定為 ByRef,可以避免過程錯誤地修改由調用方傳遞的變量。這也使得預設的調用規則與指派一緻,以便參數有效地綁定至表達式(通過表達式指派為正式參數)。

請使用者注意避免由 Visual Basic 6.0 更新到 Visual Basic.NET 帶來的混亂。如果使用者輸入的參數聲明未顯式指定其預設值為 ByVal 或 ByRef,IDE 将為其自動添加 ByVal 關鍵字。

更新

向導

為沒有指定 ByVal 或 ByRef 為預設值的參數添加 ByRef。

IsMissing 參數和可選參數

Visual

Basic 6.0 沒有預設值的可選 Variant 參數将被初始化為特殊的錯誤代碼,此錯誤代碼可以由 IsMissing 函數檢測出來。

Visual Basic.NET

在 Visual Basic.NET 中要求所有的可選參數均指定預設值。這樣可以減少語言中特殊值的數量,進而簡化語言。

更新

向導

IsMissing 函數由 IsNothing 函數代替,并且标記有更新警告注釋。

ParamArray 參數

Visual

Basic 6.0 當變量傳遞給 ParamArray 參數時,可以通過被調用的函數修改。不支援 ByVal ParamArray 元素。

Visual Basic.NET

當變量傳遞給 ParamArray 參數時,不能通過被調用的函數修改。不支援 ByRef ParamArray 元素。

ParamArray 參數最常見的情況是不修改傳遞給此參數的變量。不支援 ByRef ParamArray 參數簡化了 ParamArray 調用規則,因為 ParamArray 參數将被指定為正常數組。這樣,ParamArray 參數可以擴充到任何元素類型,同時需要 ParamArray 參數的函數均可通過數組(而不是參數清單)直接調用.

更新

向導

過程的 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() '再次允許移動對象執行個體

允許運作時移動資料項目能夠改善運作時的性能

更新向導

這些語句不會自動更新,是以将标記有“(statement) is not supported”[(語句)不被支援] 的更新錯誤。例如,以下代碼:

a = VarPtr(b)

更新後将變為:

' 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 将成為保留字。

更新

向導

檔案 I/O 語句将更新為相應的函數。例如,以下代碼:

Open nput )

Debug.Print

Visual

Basic 6.0 Debug.Print 将一行文字輸出到“立即”視窗。

Visual Basic.NET

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

更新

向導

Debug.Print 更新為 Debug.WriteLine。

資源檔案

Visual

Basic 6.0 Visual Basic 6.0 支援每個工程使用一個 .res 檔案。

Visual Basic.NET

Visual Basic.NET 支援多種資源檔案。可以綁定窗體以自動從新的 .resX 格式資源檔案中檢索資源。任何 CLR 類均可存儲在 .resX 檔案中。

更新

向導

檔案由 .res 更新為 .resX,并且代碼被修改以便從 .resX 檔案中加載。

Windows 應用程式

Visual Basic 窗體

Visual

Basic 6.0 Visual Basic 6.0 具有自己的窗體包,用于建立圖形 Windows 應用程式。

Visual Basic.NET

對于 Visual Basic.NET,Windows 窗體是一種新的窗體包。由于 Windows 窗體是以公共語言運作時 (CLR) 為目标構造的,是以 Windows 窗體可以充分利用 CLR 的全部功能。特别是,由于 Windows 窗體包具有部署、應用程式分離、版本和代碼通路安全特性方面的優勢,您現在可以構造基于 Windows 的用戶端應用程式,其部署和更新明顯更加簡易。您甚至可以構造與 HTML 具有相同浏覽器部署方案的 Windows 窗體應用程式。正如代碼通路安全性的粒度控制一樣,這些特性也使得在浏覽器中使用 Windows 窗體控件非常令人矚目。

Windows 窗體集還為 Visual Basic 開發者提供了許多新功能,例如可視化繼承、改進的本地化和通路支援、自動調整窗體大小和就地菜單編輯器。

更新

向導

将 Visual Basic 窗體更新為 Windows 窗體。

PrintForm 方法

Visual

Basic 6.0 PrintForm 方法将 Form 對象的圖象一個位元組一個位元組地發送至列印機。但是,此列印功能在某些窗體中無法正常工作。

Visual Basic.NET

在 Windows 窗體中,Visual Basic.NET 采用的列印架構使您可以快速生成複雜的列印文檔。它還包括内置的“列印預覽”對話框。

更新

向導

PrintForm 方法調用标記有更新錯誤。您可以使用新的列印架構建立列印文檔,甚至可以拍下應用程式視窗的螢幕快照并進行列印。

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+ 的基礎上建構的。GDI+ 是功能豐富的二維文字和圖象處理圖形庫,現在可以直接在 Visual Basic.NET 中使用。在以前的版本中,如果不通過 Declare 語句和 GDI API,Visual Basic 程式員無法使用這些功能。雖然這一轉變比較大,但是 GDI+ 的靈活性和強大功能讓程式員能夠快速開發應用程式,而使用以前版本的 Visual Basic 将會花費多得多的工作量。

更新

向導

對這些方法的調用标記有更新錯誤。您可以在 System.Drawing 中記下使用 GDI+ 類的圖形調用。

Name 屬性

Visual

Basic 6.0 Name 屬性傳回代碼中使用的名稱以識别窗體、控件或資料通路對象。在運作時為隻讀。

Visual Basic.NET

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

更新

向導

控件的 Name 屬性将标記有更新錯誤。

Caption 屬性

Visual

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

Visual Basic.NET

在 Windows 窗體中,對于所有控件,用于顯示控件中文字的屬性均統一稱為 Text。這簡化了控件的使用。

更新

向導

将控件的 Caption 屬性變為 Text。

Tag 屬性

Visual

Basic 6.0 Tag 屬性可以傳回或設定用于存儲程式所需額外資料的表達式。

在 Visual Basic 6.0 中無法擴充内置控件,是以 Tag 屬性是必需的。

Visual Basic.NET

在 Windows 窗體中,您可以使用繼承來擴充内置控件,并添加自己的屬性。将繼承作為工具使用明顯使内置控件更加靈活。您不僅可以根據需要添加任意多種屬性,還可以将這些屬性設為強屬性。

更新

向導

相容庫中的 Windows 窗體擴充程式 Tag 控件用于提供相同的功能。

ScaleMode 屬性

Visual

Basic 6.0 ScaleMode 屬性傳回或設定一個值,以在使用圖形方法或定位控件時表明對象的坐标度量機關。

Visual Basic.NET

Windows 窗體始終使用象素作為度量機關,簡化了窗體布局。

此外,Windows 窗體使用更好的方法來調整大小。AutoScaleBaseSize 屬性根據螢幕的分辨率 (dpi) 和使用的字型大小自動調整縮放比例。

更新

向導

使用“twip”(缇)(Visual Basic 6.0 中 ScaleMode 的預設設定)的代碼将完全更新。如果 ScaleMode 為非缇,您将遇到調整大小方面的問題。

有關該主題的全面說明,請參閱白皮書《準備将 Visual Basic 6.0 應用程式更新到 Visual Basic.NET》(英文)。

字型

Visual

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

Visual Basic.NET

窗體和控件隻能使用 TrueType 或 OpenType 字型。使用這些類型的字型可以解決不同作業系統版本及其本地化版本之間的許多不一緻性問題。這些字型還具有不依賴裝置分辨率和反走樣等功能。

更新

向導

如果在應用程式中使用非 TrueType 字型,這些字型将變為預設的 Windows 窗體字型,但其格式(大小、粗體、斜體和下劃線)将會丢失。

Screen.MousePointer 屬性

Visual

Basic 6.0 Screen 對象的 MousePointer 屬性可以傳回或設定一個值,以表明運作時滑鼠在應用程式窗體外部顯示的滑鼠指針類型。

Visual Basic.NET

如果滑鼠指針位于應用程式内部的窗體中,則可以進行操作;當其位于應用程式外時則不能。在今後的版本中我們将繼續完善其功能。

更新

向導

使用 Sceen.MousePointer 的語句标記有更新錯誤。

Timer.Interval 屬性

Visual

Basic 6.0 Timer 控件的 Interval 屬性傳回或設定 Timer 事件調用之間的毫秒數。如果設定為 0,則禁用 Timer 控件。Enabled 屬性還用于确定計時器是否在運作。這将引起混亂,因為即使 Enabled 屬性為 True,如果時間間隔為 0,仍不能啟用計時器。

Visual Basic.NET

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

更新

向導

如果 Timer.Interval 設定為 0,更新向導能夠檢測到這一情況,并為 Timer.Interval 标記更新錯誤。

建議您在 Visual Basic 6.0 應用程式中使用 Timer.Enabled,因為此屬性可以順利更新。

控件數組

Visual

Basic 6.0 控件數組是一組共享同一名稱和類型的控件。它們也共享同一事件過程。控件數組至少有一個元素,隻要您的系統資源和記憶體允許,它可以有任意多個元素。同一控件數組的元素具有各自的屬性設定。

Visual Basic.NET

Windows 窗體體系結構可以處理使用控制數組的多種方案。例如,在 Windows 窗體中可以通過單一事件句柄處理多個控件的多個事件。

相容庫中的“控件數組 Windows 窗體”擴充程式控件提供了這種功能。

Menu 控件

Visual

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

Visual Basic.NET

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

更新

向導

使用上下文菜單的代碼将标記有更新錯誤。可以使用 MenuItem.CloneMenu 建立 MainMenu 項目的副本,用作 ContextMenu 項目。

OLE 容器控件

Visual

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

Visual Basic.NET

Visual Basic.NET 中沒有 OLE 容器控件。如果需要與 OLE 容器控件相當的控件,可以将 WebBrowser 控件添加至窗體,并将其用作 OLE 容器控件。

更新

向導

在更新報告中報告此更新錯誤,并在窗體中放置不受支援控件的占位符。

Image 控件

Visual

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

Visual Basic.NET

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

更新

向導

Image 控件變為 PictureBox 控件。

Line 和 Shape 控件

Visual

Basic 6.0 Line 控件顯示水準線、垂直線或對角線。Shape 控件顯示矩形、正方形、橢圓形、圓形、圓角矩形或圓角正方形。

Visual Basic.NET

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

更新

向導

水準和垂直 Line 控件變為 Label 控件(沒有文字,高度或寬度設定為 1)。對角線控件在更新報告中報告有更新錯誤,并在窗體中放置不受支援控件的占位符。

矩形和正方形 Shape 控件變為 Label 控件。其他 Shape 控件在更新報告中報告有更新錯誤,并在窗體中放置不受支援控件的占位符。

Windowless 控件

Visual

Basic 6.0 輕便控件,有時稱為無視窗的控件,與正常控件最顯著差別是:沒有視窗句柄(hWnd 屬性)。是以,它們使用的系統資源較少。您可以在設計時将 Windowless 屬性設定為 True 以建立輕便使用者控件。輕便使用者控件隻能包含其他輕便使用者控件。并非所有容器均支援輕便控件。

Visual Basic.NET

在 Windows 窗體中,大多數無視窗控件預設在視窗中使用。使用無視窗控件的主要優點是:當窗體中有非常大量的控件時,可以減少資源消耗(視窗句柄)。這僅限于 Windows 9x。Microsoft Windows NT? 和 Microsoft Windows 2000 沒有這種資源限制。

使用無視窗控件也有缺點(如分層等布局問題),但 Microsoft 認識到了無視窗控件的作用,并将釋出示例來展示如何在 Windows 窗體中獲得類似效果.

更新

向導

無需特别處理。

Clipboard

Visual

Basic 6.0 Clipboard 對象提供了對系統剪貼闆的通路。

Visual Basic.NET

Clipboard 類提供了在系統剪貼闆上放置資料和從其上檢索資料的方法。新的 Clipboard 類提供了更多功能,并且支援的剪貼闆格式比 Visual Basic 6.0 Clipboard 對象更多。對象子產品經過了重新建構以支援這些功能。

更新

向導

由于對象子產品之間的差異,現有的剪貼闆代碼無法自動更新。Clipboard 語句将标記有更新錯誤。

動态資料交換

Visual

Basic 6.0 某些控件具有支援動态資料交換 (DDE) 會話的屬性和方法。

Visual Basic.NET

Windows 窗體不支援内置 DDE。

更新

向導

DDE 屬性和方法标記有更新警告。

Web 應用程式

WebClass

Visual

Basic 6.0 WebClass 是駐留在 Web 伺服器上的 Visual Basic 元件,能夠響應浏覽器的輸入。WebClass 通常包括 WebItems,用于為浏覽器和公開事件提供内容。

Visual Basic.NET

Web 窗體具有 .NET 架構功能,可以用來為 Web 應用程式建立基于浏覽器的使用者界面。Visual Basic.NET 具有“所見即所得”的設計器,可以使用工具箱中的控件建立圖形 Web 窗體。這樣,Web 使用者界面開發與 Windows 開發具有同樣的形式。此外,當建立項目後,Internet Information Services (IIS) 伺服器不必停止并重新啟動即可開始部署新内容,而使用 WebClass 則不能。

更新

向導

WebClass 将更新為 Web 窗體。所有狀态存儲調用均标記有更新警告。可以重新編寫這些代碼,以使用 ASP.NET 狀态管理的優勢。

您也可以選擇繼續使用 Visual Basic 6.0 中的 WebClass 應用程式,從 Visual Basic.NET Web 窗體中定位至 WebClass 和 WebForm,等等。

ActiveX 文檔和 DHTML 應用程式

Visual

Basic 6.0 ActiveX? 文檔在 Internet 浏覽器視窗中顯示,并提供内置的視區滾動、超連結和菜單協商。DHTML 應用程式包含 DHTML 頁面和用戶端 ActiveX DLL。

Visual Basic.NET

Web 窗體通過采用 HTML 以支援多種應用程式。通過使用寄存在浏覽器中的 Windows 窗體控件或已下載下傳的“安全 Windows 窗體”EXE,它能夠以更安全的方式支援多種應用程式。此代碼在安全沙箱中運作,是以不會對使用者的計算機造成損害。

更新

向導

雖然 ActiveX 文檔和 DHTML 應用程式無法直接更新,您仍可以在 ActiveX 文檔、DHTML 應用程式和 Web 窗體之間切換。

資料

ADO、RDO 和 DAO 代碼

Visual

Basic 6.0 ActiveX? 資料對象 (ADO)、遠端資料對象 (RDO) 和資料通路對象 (DAO) 用于連接配接和斷開資料通路。

Visual Basic.NET

ADO.NET 提供了斷開資料通路的其他類。與用于分布式應用程式的較早版本 ADO 相比,這些類提供了更好的性能和可伸縮性。它們也使 XML 資料與資料庫資料的內建更加簡單。

更新

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

ADO、RDO 和 DAO 資料綁定

Visual

Basic 6.0 Visual Basic 窗體中的控件可以綁定到 ActiveX? 資料對象 (ADO)、遠端資料對象 (RDO) 和資料通路對象 (DAO) 資料源。

Visual Basic.NET

ADO.NET 為 Windows 窗體控件提供了讀/寫資料綁定,為 Web 窗體提供了隻讀資料綁定。

更新

向導

ADO 資料綁定更新為新的 ADO.NET 資料綁定。但是,RDO 和 DAO 資料綁定無法更新,将會在更新報告中報告更新錯誤。

IDE

“立即”視窗

Visual

Basic 6.0 在設計模式的“立即”視窗,您可以運作部分代碼,而不必通過其 Startup 對象啟動整個應用程式。例如,可以顯示窗體、調用子產品過程以及與全局變量互動。這是因為 Visual Basic 6.0 是從代碼的記憶體映象運作,而不是調試運作時使用的已建立輸出。

Visual Basic.NET

可以從設計模式的“指令”視窗中執行 IDE 指令,但是不能運作應用程式的各個部分。這是因為 Visual Basic.NET 的運作和調試所使用的是運作時的實際輸出。這種形式的調試最精确地再現了運作時的行為。

IDE 和項目擴充性

Visual

Basic 6.0 隻有 Visual Basic 6.0 支援 Visual Basic 6.0 內建開發環境 (IDE) 擴充模型。

Visual Basic.NET

對于 Visual Studio.NET 中的所有工程類型,新的 IDE 擴充模型是通用的。這使得建立與多種不同類型工程協作的外接程式更加簡單。Visual Basic 工程系統擴充模型也可以與 C# 共享,是以工程的特定功能(例如添加引用或更改工程屬性)在兩種語言中的用法相同。

Visual Studio.NET 代碼模型也給擴充級編寫者提供了公共對象模型,以編寫跨不同語言工程使用的代碼。Visual Basic 支援通過代碼模型讀取代碼。要編寫代碼,您可以從模型中取出一個插入點,然後寫入 Visual Basic 文法

繼續閱讀