很久以來,VB因為缺乏完善的面向對象支持、缺乏高效的錯誤處理機制和性能表現不佳,因而一直受到某些人的嘲笑。VB.NET將徹底改變這種情況。然而,VB.NET在這些方面的改進也要付出代價,許多舊的代碼需要手工進行轉換才能在VB.NET下運行。
下面幾個表格總結了VB.NET語言在語法上的改動之處。注意這些表格並沒有完全列出所有改動之處,但列出了最重要的一些改動。
表A對比了VB6中一些熟悉的語法形式及其在VB.NET中類似功能最接近的語法形式。
表A:語法對比舊語法 新語法 說明窗體裝載事件,類初始化事件 Sub New procedure Sub New稱為構造方法(Constructor),它可以有參數。
Property Let Property Set Let關鍵詞不再有效。
Currency Decimal 在VB6中,Decimal是Variant的一種子類型,但在。NET中它是一種固有的數據類型。。NET不再支持Currency數據類型。
Variant Object VB.NET的Object數據類型兼有VB6 Object類型和Variant類型的能力。
Debug.Print Debug.Write Debug.WriteLine 這個變化只是名稱上的簡單變化:從Print變為Write和WriteLine. Wend End While VB.NET推薦使用While循環而不是Do循環。
為了讓VB的數據類型和其他。NET語言的數據類型相匹配,Microsoft修改了整數類數據類型的表示方法,並加入了一個新的數據類型。這些改動對於進行外部調用的方法尤其重要(比如API調用)。例如,如果被調用函數需要一個32位的整數參數,則在VB6中它應該聲明為Long,在VB.NET中應該聲明為Integer.
表B:和整數有關的數據類型長度 VB6以及更早版本中的名稱 VB.NET中的名稱16 bit Integer Short 32 bit Long Integer 64 bit (無) Long
在VB.NET中,Microsoft減少了許多原先用於VB6的關鍵詞,代之以“框架類”。之所以要進行這種替換,是因為框架類中的功能對所有的.NET語言都有效。下表列出了部分受影響的關鍵詞。
表C:被替換的關鍵詞
VB關鍵詞 VB.NET名稱空間中的位置 方法/屬性
Circle System.Drawing.Graphics DrawEllipse
Line System.Drawing.Graphics DrawLine
Atn System.Math Atan
Sgn System.Math Sign
Sqr System.Math Sqrt
Rnd Microsoft.VisualBasic.Compatibility.VB6 Rnd
Round Microsoft.VisualBasic.Compatibility.VB6 Round
Lset System.String PadRight
Rset System.String PadLeft
DoEvents System.Winforms.Application DoEvents
VarType System.Object GetType(返回類Type的對象,其中包含了可提取出信息的屬性)
在VB.NET中,變量、數組的聲明和初始化方法都有所變化,下表概要地列出了VB.NET在這方面的變化。
表D:新的聲明方法
變化 語法舉例
單個聲明語句中不能聲明多種類型。 'VB.NET不允許出現下面這種聲明!
Dim nCount As Integer, bAnswer As Boolean
聲明變量時可賦予初始值 Dim nCount As Integer = 20
Dim nDoubleCount as Integer = nCount * 2
允許為數組元素指定初始值 Dim nIndex(3) As Integer = (3, 5, 7)
不能用Redim進行聲明,只能用Redim重新定義數組大小。 '下面這行代碼在VB.NET中不合法!
Redim sName() As String
大量新關鍵詞實現了VB.NET中的新功能。下面是一些最重要的關鍵詞及其用途、用法簡例。
表E:VB.NET的新關鍵詞
關鍵詞 用途 簡單例子
Inherits 指向基類,用於實現繼承。 Inherits System.WinForms.Form
MyBase 在子類的代碼中,MyBase引用基類。 StringProperty = MyBase.StringProperty
Shared Shared表示類的所有實例共享類裡面的變量。 Public Shared BaseLocation As String
Try
Catch
Finally
Throw 這是新的錯誤處理關鍵詞。Try開始一個啟用錯誤控制的代碼塊,Catch標識一個對特定錯誤進行處理的代碼塊,Finally開始一個不管錯誤是否出現都必須執行的代碼塊,Throw拋出一個錯誤(類似於VB6的Err.Raise)。 Try
rsRecordset.Update
Catch
LogError ("更新失敗!")
Finally
rsRecordset.MoveNext
End Try
ReadOnly 在屬性聲明中,ReadOnly指示一個只讀的屬性(只有Get過程的屬性)。 Public ReadOnly Property
StringProperty() As String
WriteOnly 在屬性聲明中,WriteOnly指示一個只能寫入的屬性(只有Set過程的屬性)。 Public WriteOnly Property
StringProperty() As String
Char 這是VB.NET中的單字符數據類型。 Dim chrInitial As Char
Imports 在當前代碼模塊中引入指定類。 Imports System.WinForms
Namespace 為模塊指定名稱空間(Namespace)。 Namespace MyApplicationName
Overloads 重載。Overloads表示同一個函數名字有多個版本的實現,編譯器通過函數的參數列表區分它們。 '同一個模塊之內包含如下多個聲明...
Overloads Sub Display(sIn as String)
Overloads Sub Display(nIn as Long)
Overrides 覆蓋。Overrides表示成員函數覆蓋當前類所繼承的基類中的指定方法。 Inherits MyBaseClass
Overrides Function Name(nID as Long) _
As String
Overridable Overridable表示任意從當前類繼承的類都可以覆蓋指定成員函數。 Overridable Function Name _
(nID as Long) As String
MustOverride MustOverride表示任意從當前類繼承的類都必須覆蓋指定成員函數。 MustOverride Function Name _
(nID as Long) As String
Protected Protected表示成員函數只能從當前類的派生類訪問。 Protected Sub Clear()
在以前的VB中,直至VB 4為止, Let、Set和Get屬性過程是分離的。VB.NET把同一屬性的屬性過程放到了一起:
Private msMyStringProperty As String
' 聲明區
Public Property MyStringProperty As String
Get
MyStringProperty = msMyStringProperty
End Get
Set
msMyStringProperty = MyStringProperty
End Set
End Property
VB.NET不再有Let屬性過程,因為所有賦值語句的語法(無論是對象還是非對象)都已經一樣。
語言方面的改動遠遠超過了對體系結構的改動。對於大多數人來說這些改動都有意義,但仍有人對某些改動存有異議。例如,在以前的版本中,許多任務可以用多種不同的方法完成,統一的編碼標准要麼不存在,要麼很難執行。為了“清理”VB語言,Microsoft對VB作了一些重大的改動,許多以前可以有多種實現方法的任務現在只有一種方法。
除了前面幾個表格列出的內容之外,下面是一些特別需要注意的地方。
首先,向過程參數傳遞數據的默認方式由原來的傳遞引用(ByRef)變成了傳遞值(ByVal),這是一個很重要的改動。通過引用傳遞參數比通過值傳遞參數面臨著更多的危險,這種危險在於被調用過程可能無意地改變參數的值。VB.NET仍舊允許以引用方式傳遞參數,但默認參數傳遞方式的改變意味著程序必須作相應的調整。
第二,VB.NET中不再有Set語句,把對象引用賦給變量現在只需一個等號就可以了,對象可以象任何其他值一樣對待。雖然省略Set簡化了代碼,但也有一個附帶的影響:默認屬性不再有效。例如,下面這種屬性值引用方法不再合法:
Text1 = "這是對象的默認屬性值。"
相反,屬性值必須按照如下方式顯式引用:
Text1.Text = "這是對象的默認屬性值。"
從表面上看來,VB.NET作這種要求似乎沒有必要。但事實上,它對於擺脫默認屬性來說卻是必要的。例如,假設有一個名字為objFoo的對象變量,由於沒有了Set語句,假若屬性值仍舊可以象原來一樣引用,下面這個語句到底是什麼意思就很難確定了:
objFoo = Text1
這個語句是設置了一個對Text1的引用,還是把Text1的Text屬性值賦給了objFoo?我們無法作出判斷,編譯器也同樣不能判斷。因此,拋棄Set語句也就意味著必須放棄默認屬性值。
。NET中最不讓人喜歡的改動:Microsoft改變了一些早就在使用的數據類型的含義。在。NET中,Integer變成了32位,而Long則是64位。可以想象,這種改變將導致程序員頻繁地用錯變量類型。例如,調用某個API函數時應該使用16位的Integer還是使用32位的Integer?但願Microsoft能夠重新考慮這個決定,采用一些新的變量類型名字,如Int32和Long64.
VB.NET引入了Option Strict關鍵詞。Option Strict關鍵詞用於替代Option Explicit.原來的VB允許把一個數字值賦給字符串變量,或者進行其它類似的不正常賦值操作,Option Strict結束了這種情況。聲明Option Strict告訴Visual Basic.NET不要進行任何強制的類型轉換。當然,VB.NET也不是完全限制了類型自動轉換:它允許進行向下的自動類型轉換(Cast),但不支持向上的自動類型轉換。例如,如果不是使用“sngvariable = CSng(dblvariable)”這類語句進行顯式的類型轉換,聲明為Single的變量不能設置為Double變量的值,因為它可能導致數據丟失;然而,Double變量可以直接設置為Single類型變量的值,且無需顯式地進行類型轉換,因為這裡不存在數據丟失問題。使用Option Strict能夠幫助開發者減少許多錯誤,包括許多難以調試的錯誤。附帶說明:使用Option Strict時不允許再使用延遲綁定。