VB.NET語法快速入門
很久以來我們都知道,VB因為缺乏完善的面向對象支持、缺乏高效的錯誤處理機制和性能表現不佳,因而一直受到某些人的嘲笑。VB.NET語法將徹底改變這種情況。
然而,VB.NET在這些方面的改進也要付出代價,許多舊的代碼需要手工進行轉換才能在VB.NET下運行。
下面幾個表格總結了VB.NET語言在語法上的改動之處。注意這些表格并沒有完全列出所有改動之處,但列出了最重要的一些改動。
表A對比了VB6中一些熟悉的語法形式及其在VB.NET中類似功能最接近的語法形式。
表A:VB.NET語法對比舊語法 新語法 說明窗體裝載事件,類初始化事件 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語言的數據類型和其他。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時不允許再使用延遲綁定。
本文主要簡單介紹了VB.NET語法的一些使用以及注意事項,希望對大家的學習帶來收益。
【編輯推薦】