從VB6到VB.NET的變化綜述
當(dāng)創(chuàng)建ASP.NET頁(yè)面時(shí),需要使用一種與兼容 .NET的編程語(yǔ)言,如C#、VB.NET或JScript.NET。但是從VB6/VBScript 到VB.NET有許多重要的變化,這正是本文所涉及的內(nèi)容。
另外,如果想獲得更多有關(guān)的信息,我強(qiáng)烈推薦你閱讀Microsoft的文章:為Visual Basic 6.0應(yīng)用程序升級(jí)到Visual Basic.NET做好準(zhǔn)備。
引言
隨著Microsoft .NET平臺(tái)的發(fā)布,Visual Basic開(kāi)始成為一種完全面向?qū)ο蟮恼Z(yǔ)言,簡(jiǎn)稱(chēng)為VB.NET。雖然有了一些根本性的變化,開(kāi)發(fā)者從VB6到VB.NET的學(xué)習(xí)熱情依然相當(dāng)高,即使對(duì)于有經(jīng)驗(yàn)的編程人員也是如此。本文中,我將列出Visual Basic語(yǔ)言中的變化,并在適當(dāng)?shù)牡胤脚e例說(shuō)明。這里所列出的可能不完全,但是已經(jīng)包括了大部分的功能。如果你是一個(gè)想要轉(zhuǎn)到VB.NET上去的 VB程序員,這篇文章就一定要讀一讀。
ASP.NET Beta 1版本可以從http://www.asp.net/免費(fèi)下載。本文中所討論的一些變化是屬于 Beta 2版本的,這些 Beta 2中的新內(nèi)容在ASP.NET的Beta 1 版本中是無(wú)效的,文中都作了注明。
數(shù)據(jù)類(lèi)型的改變
.NET平臺(tái)為所有支持語(yǔ)言提供了公共類(lèi)型系統(tǒng),這就意味著所有語(yǔ)言都必須支持支持公共語(yǔ)言運(yùn)行時(shí)間環(huán)境所強(qiáng)制的相同的數(shù)據(jù)類(lèi)型,如此就消除了不同語(yǔ)言之間數(shù)據(jù)類(lèi)型的不兼容性。例如,在一個(gè)32位的Windows平臺(tái)上,在C++這類(lèi)語(yǔ)言中,integer數(shù)據(jù)類(lèi)型占據(jù)4個(gè)字節(jié),而在 VB 中則占據(jù)2個(gè)字節(jié)。以下是VB.NET中與數(shù)據(jù)類(lèi)型有關(guān)的變化:
在 .NET下,VB.NET 中的Integer數(shù)據(jù)類(lèi)型也是4個(gè)字節(jié)。
VB.NET沒(méi)有currency 數(shù)據(jù)類(lèi)型,作為代替,它提供了decimal。
VB.NET 引入了一種新的數(shù)據(jù)類(lèi)型,叫做Char。 Char數(shù)據(jù)類(lèi)型占據(jù)2個(gè)字節(jié),可以存儲(chǔ)Unicode 字符。
VB.NET 沒(méi)有Variant數(shù)據(jù)類(lèi)型。為了得到與variant類(lèi)型相同的結(jié)果,你可以使用Object數(shù)據(jù)類(lèi)型。因?yàn)樵?NET中的一切,包括原始數(shù)據(jù)類(lèi)型,都是一個(gè)對(duì)象,一個(gè)object類(lèi)型的變量,它可以指向任何數(shù)據(jù)類(lèi)型。
在VB.NET中沒(méi)有固定長(zhǎng)度字符串的概念。
在VB6中,我們使用Type關(guān)鍵字來(lái)聲明用戶自定義結(jié)構(gòu)。VB.NET引入了與此目的相同的結(jié)構(gòu)關(guān)鍵字,語(yǔ)法的其它部分是相同的:
Structure MyStruct1
...
End Structure
變量聲明
現(xiàn)在看看一個(gè)簡(jiǎn)單的VB6例子:
Dim x,y as integer
在這個(gè)例子中,VB6 將 x看成variant,把y 看成integer。VB.NET改進(jìn)了這個(gè)解釋?zhuān)鼘 和y都創(chuàng)建成integer。另外,VB.NET 還允許你在聲明語(yǔ)句中為變量賦初始值,如下:
Dim str1 as string="hello"
VB.NET 還引入了Read-Only (只讀)變量。只讀變量不像常數(shù),聲明它的時(shí)候不用初始化,但是一旦你給它賦值,就不能再修改。請(qǐng)看下面的例子:
'未初始化
Dim readonly x as integer
'附值
x=100
'不能再被修改,因此下面的語(yǔ)句將出錯(cuò)
x=200
數(shù)組
使用 VB6時(shí),你可以通過(guò)編程來(lái)定義數(shù)組的上限和下限。而在VB.NET中,數(shù)組的下限總是0,定義數(shù)組時(shí)是這樣的:
Dim aStates(50) as String
這樣實(shí)際創(chuàng)建的元素是 51 個(gè),其中 0是下限,50是上限。注意:在VB.NET Beta 1中,以上語(yǔ)句會(huì)創(chuàng)建50個(gè)元素,上下限是 0到 49。
變量范圍
考慮以下 VB6 代碼:
If x=y then
Dim z as integer
' other code
End If
z=100 'Outside of If ... Then block
以上代碼在VB6中運(yùn)行得非常好,因?yàn)樗鼪](méi)有模塊級(jí)變量作用范圍。模塊級(jí)變量發(fā)生在其它高級(jí)編程語(yǔ)言中,如C++。在聲明模塊中定義的變量,如在 If ... Then模塊中定義的變量,當(dāng)這個(gè)聲明模塊結(jié)束時(shí)就會(huì)落在范圍之外。這樣一來(lái),如果在其定義的If ... Then模塊之外存取 z,在高級(jí)編程語(yǔ)言中就會(huì)導(dǎo)致一個(gè)錯(cuò)誤。而VB.NET與VB6相反,它使用了模塊層的變量范圍。
Set和Let聲明
在VB6中,你必須使用 Set聲明為變量分配一個(gè)對(duì)象例示。出于默認(rèn)屬性的原因,這在VB6 中是必須的。要想告訴VB你想給對(duì)象本身指定一個(gè)變量(與對(duì)象的默認(rèn)屬性值相反),你就必須要使用Set關(guān)鍵字。例如,在 VB6中:
Dim x as Variant
Dim strName as string
'Assign the value of Text1.Text to StrName
'(Text is the default property of the textbox control in VB6)
StrName=Text1
'Here we assign the actual Textbox object to the variable x
'Note that we use the Set keyword so VB knows we want to assign
'to x the object itself instead of the default property
Set x=Text1
但是在VB.NET中,是不允許默認(rèn)屬性的(除非是參數(shù)化了的屬性),因此就不需要使用 Set關(guān)鍵字。同樣,Let關(guān)鍵字也從VB.NET 的語(yǔ)法中去掉了。
錯(cuò)誤處理
Visual Basic最終結(jié)合了結(jié)構(gòu)化錯(cuò)誤處理。關(guān)鍵字Try、Catch和 Finally使得錯(cuò)誤處理變簡(jiǎn)單,也使VB.NET與C++或 C#這些語(yǔ)言可以并列起來(lái)。Try ... Catch的模式允許開(kāi)發(fā)人員將可能導(dǎo)致例外的代碼放置在一個(gè)Try模塊中。如果那個(gè)代碼確實(shí)造成了一個(gè)例外(與造成錯(cuò)誤同義),就執(zhí)行 Catch 模塊中的代碼;這個(gè)模塊中的代碼應(yīng)該是設(shè)計(jì)來(lái)處理例外的。
請(qǐng)注意,為了向后兼容,VB6中舊的錯(cuò)誤處理技術(shù)( Error Resume Next及類(lèi)似的)還是受到支持的,但是當(dāng)你用VB.NET編寫(xiě)新的應(yīng)用程序時(shí)應(yīng)該勇敢地爭(zhēng)取不使用這些舊的技術(shù)。下面的這些代碼片段說(shuō)明了VB.NET的各種錯(cuò)誤處理技術(shù):
Try
...
Catch
...
End Try
上面的代碼只是捕捉相關(guān)的Try模塊中沖突代碼所導(dǎo)致的例外。VB.NET允許你使用多個(gè)Catch 模塊來(lái)處理特殊的例外:
Try
...
Catch e1 as NullPointerException
...
Catch e2 as Exception
...
End Try
除了捕捉預(yù)先定義的例外,你還可以創(chuàng)建自己的定制例外類(lèi),這個(gè)類(lèi)是從System.Exception基礎(chǔ)類(lèi)中繼承而來(lái)的。你還可以激活自定義例外,這與VB6中Err 對(duì)象的Raise方法相同:
If myvar < 1000 then
Throw new Exception("Business Logic Error")
End If
靜態(tài)方法
VB.NET 允許你在類(lèi)中創(chuàng)建靜態(tài)方法。靜態(tài)方法指的是那些不需要開(kāi)發(fā)人員創(chuàng)建類(lèi)的例示就能調(diào)用的方法。例如,如果有一個(gè)名為 Foo的類(lèi),其中有一個(gè)非靜態(tài)方法NonStatic()和一個(gè)靜態(tài)方法Static(),就可以這樣來(lái)調(diào)用 Static()方法:
Foo.Static()
但是,非靜態(tài)方法則需要?jiǎng)?chuàng)建類(lèi)的一個(gè)例示,象這樣:
'Create an instance of the Foo class
Dim objFoo as New Foo()
'Execute the NonStatic() method
objFoo.NonStatic()
要想在一個(gè)VB.NET 類(lèi)中創(chuàng)建一個(gè)靜態(tài)方法,只需要給方法定義加上前綴Shared關(guān)鍵字。
程序和函數(shù)
在默認(rèn)狀態(tài)下,VB6中所有的程序參數(shù)都是通過(guò)引用方式(ByRef)來(lái)傳遞的,而在VB.NET的默認(rèn)狀態(tài)下,這些參數(shù)是用值方式(ByVal)來(lái)傳遞的。不管程序和函數(shù)是否接收參數(shù),當(dāng)調(diào)用它們的時(shí)候都需要圓括號(hào)。VB6中,函數(shù)返回值使用這樣的語(yǔ)法:FunctionName = return_value。在VB.NET 中,你可以使用Return關(guān)鍵字以Return return_value方式來(lái)返回值,也可以繼續(xù)使用舊的語(yǔ)法,它們?nèi)匀挥行А?/div>
屬性語(yǔ)法
在VB6 中,我們使用了Property Get 和property Set/Let在類(lèi)中創(chuàng)建屬性,它們分別出現(xiàn)在單獨(dú)的程序中:
Public Property Get PropertyName() as DataType
...
End Property
Public Property Let PropertyName(value as DataType)
...
End Property
在VB.NET中,Property Get 和 Property Let/Set這兩個(gè)語(yǔ)句被合并成一個(gè)Property語(yǔ)句,而不再是兩個(gè)單獨(dú)的語(yǔ)句。另外,在Property 語(yǔ)句的Set部分中,變量Value指的是用戶給指定屬性賦值時(shí)輸入的那個(gè)值。
Public [ReadOnly|WriteOnly] Property PropertyName as DataType
Get
Return m_var
End Get
Set
M_var = Value
End Set
End Property
結(jié)論
VB.NET的語(yǔ)義和語(yǔ)法都發(fā)生了一些變化,這里所列舉的都是作為一個(gè)ASP.NET開(kāi)發(fā)人員將要遇到的最重要的變化。當(dāng)你用VB.NET創(chuàng)建ASP.NET Web頁(yè)面時(shí),需要牢記的最重要的幾點(diǎn)是:
變量可以被分類(lèi),不再都是Variants。就是說(shuō),如果你需要一個(gè)Integer變量,就應(yīng)該使用Dim i as Integer,而不僅僅是用Dim i。給變量分類(lèi)比無(wú)分類(lèi)的變量的性能要好得多。
要牢記,VB.NET要求子程序調(diào)用時(shí)在調(diào)用參數(shù)周?chē)訄A括號(hào)。 這就是說(shuō)Response.Write "Hello, World!" 會(huì)生成錯(cuò)誤,正確的應(yīng)該是Response.Write("Hello, World!")。
VB.NET 不再支持默認(rèn)屬性,你必須對(duì)希望從一個(gè)對(duì)象中存取的屬性進(jìn)行明確地說(shuō)明。
聲明數(shù)組時(shí)要注意,VB.NET中所有數(shù)組的下限都是0,上限則是由你規(guī)定
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。