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