VB.NET語法快速入門
很久以來我們都知道,VB因?yàn)槿狈ν晟频拿嫦驅(qū)ο笾С帧⑷狈Ω咝У腻e(cuò)誤處理機(jī)制和性能表現(xiàn)不佳,因而一直受到某些人的嘲笑。VB.NET語法將徹底改變這種情況。
然而,VB.NET在這些方面的改進(jìn)也要付出代價(jià),許多舊的代碼需要手工進(jìn)行轉(zhuǎn)換才能在VB.NET下運(yùn)行。
下面幾個(gè)表格總結(jié)了VB.NET語言在語法上的改動(dòng)之處。注意這些表格并沒有完全列出所有改動(dòng)之處,但列出了最重要的一些改動(dòng)。
表A對比了VB6中一些熟悉的語法形式及其在VB.NET中類似功能最接近的語法形式。
表A:VB.NET語法對比舊語法 新語法 說明窗體裝載事件,類初始化事件 Sub New procedure Sub New稱為構(gòu)造方法(Constructor),它可以有參數(shù)。
Property Let Property Set Let關(guān)鍵詞不再有效。
Currency Decimal 在VB6中,Decimal是Variant的一種子類型,但在。NET中它是一種固有的數(shù)據(jù)類型。。NET不再支持Currency數(shù)據(jù)類型。
Variant Object VB.NET的Object數(shù)據(jù)類型兼有VB6 Object類型和Variant類型的能力。
Debug.Print Debug.Write Debug.WriteLine 這個(gè)變化只是名稱上的簡單變化:從Print變?yōu)閃rite和WriteLine. Wend End While VB.NET推薦使用While循環(huán)而不是Do循環(huán)。
為了讓VB.NET語言的數(shù)據(jù)類型和其他。VB.NET語言的數(shù)據(jù)類型相匹配,Microsoft修改了整數(shù)類數(shù)據(jù)類型的表示方法,并加入了一個(gè)新的數(shù)據(jù)類型。這些改動(dòng)對于進(jìn)行外部調(diào)用的方法尤其重要(比如API調(diào)用)。
例如,如果被調(diào)用函數(shù)需要一個(gè)32位的整數(shù)參數(shù),則在VB6中它應(yīng)該聲明為Long,在VB.NET中應(yīng)該聲明為Integer.
表B:和整數(shù)有關(guān)的數(shù)據(jù)類型長度 VB6以及更早版本中的名稱 VB.NET中的名稱16 bit Integer Short 32 bit Long Integer 64 bit (無) Long
在VB.NET中,Microsoft減少了許多原先用于VB6的關(guān)鍵詞,代之以“框架類”。之所以要進(jìn)行這種替換,是因?yàn)榭蚣茴愔械墓δ軐λ械?NET語言都有效。下表列出了部分受影響的關(guān)鍵詞。
表C:被替換的關(guān)鍵詞
VB關(guān)鍵詞 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中,變量、數(shù)組的聲明和初始化方法都有所變化,下表概要地列出了VB.NET在這方面的變化。
表D:新的聲明方法
變化 語法舉例
單個(gè)聲明語句中不能聲明多種類型。 'VB.NET不允許出現(xiàn)下面這種聲明!
Dim nCount As Integer, bAnswer As Boolean
聲明變量時(shí)可賦予初始值 Dim nCount As Integer = 20
Dim nDoubleCount as Integer = nCount * 2
允許為數(shù)組元素指定初始值 Dim nIndex(3) As Integer = (3, 5, 7)
不能用Redim進(jìn)行聲明,只能用Redim重新定義數(shù)組大小。 '下面這行代碼在VB.NET中不合法!
- Redim sName() As String
大量新關(guān)鍵詞實(shí)現(xiàn)了VB.NET中的新功能。下面是一些最重要的關(guān)鍵詞及其用途、用法簡例。
表E:VB.NET的新關(guān)鍵詞
關(guān)鍵詞 用途 簡單例子
Inherits 指向基類,用于實(shí)現(xiàn)繼承。 Inherits System.WinForms.Form
MyBase 在子類的代碼中,MyBase引用基類。 StringProperty = MyBase.StringProperty
Shared Shared表示類的所有實(shí)例共享類里面的變量。
- Public Shared BaseLocation As String
- Try
- Catch
- Finally
Throw 這是新的錯(cuò)誤處理關(guān)鍵詞。Try開始一個(gè)啟用錯(cuò)誤控制的代碼塊,Catch標(biāo)識一個(gè)對特定錯(cuò)誤進(jìn)行處理的代碼塊,F(xiàn)inally開始一個(gè)不管錯(cuò)誤是否出現(xiàn)都必須執(zhí)行的代碼塊,Throw拋出一個(gè)錯(cuò)誤(類似于VB6的Err.Raise)。
- Try
- rsRecordset.Update
- Catch
- LogError ("更新失敗!")
- Finally
- rsRecordset.MoveNext
- End Try
- ReadOnly 在屬性聲明中,ReadOnly指示一個(gè)只讀的屬性(只有Get過程的屬性)。 Public ReadOnly Property
- StringProperty() As String
- WriteOnly 在屬性聲明中,WriteOnly指示一個(gè)只能寫入的屬性(只有Set過程的屬性)。 Public WriteOnly Property
- StringProperty() As String
- Char 這是VB.NET中的單字符數(shù)據(jù)類型。 Dim chrInitial As Char
- Imports 在當(dāng)前代碼模塊中引入指定類。 Imports System.WinForms
- Namespace 為模塊指定名稱空間(Namespace)。 Namespace MyApplicationName
- Overloads 重載。Overloads表示同一個(gè)函數(shù)名字有多個(gè)版本的實(shí)現(xiàn),編譯器通過函數(shù)的參數(shù)列表區(qū)分它們。 '同一個(gè)模塊之內(nèi)包含如下多個(gè)聲明...
- Overloads Sub Display(sIn as String)
- Overloads Sub Display(nIn as Long)
- Overrides 覆蓋。Overrides表示成員函數(shù)覆蓋當(dāng)前類所繼承的基類中的指定方法。 Inherits MyBaseClass
- Overrides Function Name(nID as Long) _
- As String
- Overridable Overridable表示任意從當(dāng)前類繼承的類都可以覆蓋指定成員函數(shù)。 Overridable Function Name _
- (nID as Long) As String
- MustOverride MustOverride表示任意從當(dāng)前類繼承的類都必須覆蓋指定成員函數(shù)。 MustOverride Function Name _
- (nID as Long) As String
- Protected Protected表示成員函數(shù)只能從當(dāng)前類的派生類訪問。 Protected Sub Clear()
在以前的VB中,直至VB 4為止, Let、Set和Get屬性過程是分離的。VB.NET把同一屬性的屬性過程放到了一起:
- Private msMyStringProperty As String
- ' 聲明區(qū)
- Public Property MyStringProperty As String
- Get
- MyStringProperty = msMyStringProperty
- End Get
- Set
- msMyStringProperty = MyStringProperty
- End Set
- End Property
VB.NET不再有Let屬性過程,因?yàn)樗匈x值語句的語法(無論是對象還是非對象)都已經(jīng)一樣。
語言方面的改動(dòng)遠(yuǎn)遠(yuǎn)超過了對體系結(jié)構(gòu)的改動(dòng)。對于大多數(shù)人來說這些改動(dòng)都有意義,但仍有人對某些改動(dòng)存有異議。例如,在以前的版本中,許多任務(wù)可以用多種不同的方法完成,統(tǒng)一的編碼標(biāo)準(zhǔn)要么不存在,要么很難執(zhí)行。為了“清理”VB語言,Microsoft對VB作了一些重大的改動(dòng),許多以前可以有多種實(shí)現(xiàn)方法的任務(wù)現(xiàn)在只有一種方法。
除了前面幾個(gè)表格列出的內(nèi)容之外,下面是一些特別需要注意的地方。
首先,向過程參數(shù)傳遞數(shù)據(jù)的默認(rèn)方式由原來的傳遞引用(ByRef)變成了傳遞值(ByVal),這是一個(gè)很重要的改動(dòng)。通過引用傳遞參數(shù)比通過值傳遞參數(shù)面臨著更多的危險(xiǎn),這種危險(xiǎn)在于被調(diào)用過程可能無意地改變參數(shù)的值。VB.NET仍舊允許以引用方式傳遞參數(shù),但默認(rèn)參數(shù)傳遞方式的改變意味著程序必須作相應(yīng)的調(diào)整。
第二,VB.NET中不再有Set語句,把對象引用賦給變量現(xiàn)在只需一個(gè)等號就可以了,對象可以象任何其他值一樣對待。雖然省略Set簡化了代碼,但也有一個(gè)附帶的影響:默認(rèn)屬性不再有效。
例如,下面這種屬性值引用方法不再合法:
Text1 = "這是對象的默認(rèn)屬性值。"
相反,屬性值必須按照如下方式顯式引用:
Text1.Text = "這是對象的默認(rèn)屬性值。"
從表面上看來,VB.NET作這種要求似乎沒有必要。但事實(shí)上,它對于擺脫默認(rèn)屬性來說卻是必要的。例如,假設(shè)有一個(gè)名字為objFoo的對象變量,由于沒有了Set語句,假若屬性值仍舊可以象原來一樣引用,下面這個(gè)語句到底是什么意思就很難確定了:
- objFoo = Text1
這個(gè)語句是設(shè)置了一個(gè)對Text1的引用,還是把Text1的Text屬性值賦給了objFoo?我們無法作出判斷,編譯器也同樣不能判斷。因此,拋棄Set語句也就意味著必須放棄默認(rèn)屬性值。
NET中最不讓人喜歡的改動(dòng):Microsoft改變了一些早就在使用的數(shù)據(jù)類型的含義。在。NET中,Integer變成了32位,而Long則是64位??梢韵胂螅@種改變將導(dǎo)致程序員頻繁地用錯(cuò)變量類型。例如,調(diào)用某個(gè)API函數(shù)時(shí)應(yīng)該使用16位的Integer還是使用32位的Integer?但愿Microsoft能夠重新考慮這個(gè)決定,采用一些新的變量類型名字,如Int32和Long64.
VB.NET引入了Option Strict關(guān)鍵詞。Option Strict關(guān)鍵詞用于替代Option Explicit.原來的VB允許把一個(gè)數(shù)字值賦給字符串變量,或者進(jìn)行其它類似的不正常賦值操作,Option Strict結(jié)束了這種情況。聲明Option Strict告訴Visual Basic.NET不要進(jìn)行任何強(qiáng)制的類型轉(zhuǎn)換。當(dāng)然,VB.NET也不是完全限制了類型自動(dòng)轉(zhuǎn)換:它允許進(jìn)行向下的自動(dòng)類型轉(zhuǎn)換(Cast),但不支持向上的自動(dòng)類型轉(zhuǎn)換。例如,如果不是使用“sngvariable = CSng(dblvariable)”這類語句進(jìn)行顯式的類型轉(zhuǎn)換,聲明為Single的變量不能設(shè)置為Double變量的值,因?yàn)樗赡軐?dǎo)致數(shù)據(jù)丟失;然而,Double變量可以直接設(shè)置為Single類型變量的值,且無需顯式地進(jìn)行類型轉(zhuǎn)換,因?yàn)檫@里不存在數(shù)據(jù)丟失問題。使用Option Strict能夠幫助開發(fā)者減少許多錯(cuò)誤,包括許多難以調(diào)試的錯(cuò)誤。附帶說明:使用Option Strict時(shí)不允許再使用延遲綁定。
本文主要簡單介紹了VB.NET語法的一些使用以及注意事項(xiàng),希望對大家的學(xué)習(xí)帶來收益。
【編輯推薦】