VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
當前位置:
魔兽世界wow > 編程開發 > VBnet >
  • vb.net教程之從Visual Basic 6.0 到 Visual Basic.NET 的轉換

  • 2017-06-06 14:03 來源:未知
Microsoft Visual Basic.NET 是 Microsoft Visual Basic 6.0 的后續版本,它是基于 .NET 框架重新設計的,您可以用它來輕松地創建用于 Microsoft Windows 32位 操作系統和 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
如果鼠標指針位于應用程序內部的窗體中,則可以進行操作;當其位于應用程序外時則不能。在今后的版本中我們將繼續完善其功能。

升級向導

使用 Screen.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 語法。
    (llm9178整理)

本欄文章均來自于互聯網,版權歸原作者和各發布網站所有,本站收集這些文章僅供學習參考之用。任何人都不能將這些文章用于商業或者其他目的。

相關教程