從VB6到VB.NET的變化綜述 (轉)

來源:互聯網
上載者:User
隨著Microsoft .NET平台的發布,Visual Basic開始成為一種完全物件導向的語言,簡稱為VB.NET。雖然有了一些根本性的變化,開發人員從VB6到VB.NET的學習熱情依然相當高,即使對於有經驗的編程人員也是如此。本文中,我將列出Visual Basic語言中的變化,並在適當的地方舉例說明。這裡所列出的可能不完全,但是已經包括了大部分的功能。如果你是一個想要轉到VB.NET上去的 VB程式員,這篇文章就一定要讀一讀。

ASP.NET Beta 1版本可以從http://www.asp.net/免費下載。本文中所討論的一些變化是屬於 Beta 2版本的,這些 Beta 2中的新內容在ASP.NET的Beta 1 版本中是無效的,文中都作了註明。

資料類型的改變
.NET平台為所有支援語言提供了公用類型系統,這就意味著所有語言都必須支援支援通用語言執行平台間環境所強制的相同的資料類型,如此就消除了不同語言之間資料類型的不相容性。例如,在一個32位的Windows平台上,在C++這類語言中,integer資料類型佔據4個位元組,而在 VB 中則佔據2個位元組。以下是VB.NET中與資料類型有關的變化:

在 .NET下,VB.NET 中的Integer資料類型也是4個位元組。
VB.NET沒有currency 資料類型,作為代替,它提供了decimal。
VB.NET 引入了一種新的資料類型,叫做Char。 Char資料類型佔據2個位元組,可以儲存Unicode 字元。
VB.NET 沒有Variant資料類型。為了得到與variant類型相同的結果,你可以使用Object資料類型。因為在.NET中的一切,包括未經處理資料類型,都是一個對象,一個object類型的變數,它可以指向任何資料類型。
在VB.NET中沒有固定長度字串的概念。
在VB6中,我們使用Type關鍵字來聲明使用者自訂結構。VB.NET引入了與此目的相同的結構關鍵字,文法的其它部分是相同的:
Structure MyStruct1
  ...
End Structure


變數聲明
現在看看一個簡單的VB6例子:

Dim x,y as integer  

在這個例子中,VB6 將 x看成variant,把y 看成integer。VB.NET改進了這個解釋,它將x 和y都建立成integer。另外,VB.NET 還允許你在聲明語句中為變數賦初始值,如下:

Dim str1 as string="hello"  

VB.NET 還引入了Read-Only (唯讀)變數。唯讀變數不像常數,聲明它的時候不用初始化,但是一旦你給它賦值,就不能再修改。請看下面的例子:

'未初始化
Dim readonly x as integer
'附值
x=100
'不能再被修改,因此下面的語句將出錯
x=200


數組
使用 VB6時,你可以通過編程來定義數組的上限和下限。而在VB.NET中,數組的下限總是0,定義數組時是這樣的:

Dim aStates(50) as String  

這樣實際建立的元素是 51 個,其中 0是下限,50是上限。注意:在VB.NET Beta 1中,以上語句會建立50個元素,上下限是 0到 49。

變數範圍
考慮以下 VB6 代碼:

If x=y then
  Dim z as integer
  ' other code
End If
z=100  'Outside of If ... Then block


以上代碼在VB6中運行得非常好,因為它沒有模組層級變數作用範圍。模組層級變數發生在其它進階程式設計語言中,如C++。在聲明模組中定義的變數,如在 If ... Then模組中定義的變數,當這個聲明模組結束時就會落在範圍之外。這樣一來,如果在其定義的If ... Then模組之外存取 z,在進階程式設計語言中就會導致一個錯誤。而VB.NET與VB6相反,它使用了模組層的變數範圍。


Set和Let聲明
在VB6中,你必須使用 Set聲明為變數分配一個對象例示。出於預設屬性的原因,這在VB6 中是必須的。要想告訴VB你想給對象本身指定一個變數(與對象的預設屬性值相反),你就必須要使用Set關鍵字。例如,在 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中,是不允許預設屬性的(除非是參數化了的屬性),因此就不需要使用 Set關鍵字。同樣,Let關鍵字也從VB.NET 的文法中去掉了。

錯誤處理
Visual Basic最終結合了結構化錯誤處理。關鍵字Try、Catch和 Finally使得錯誤處理變簡單,也使VB.NET與C++或 C#這些語言可以並列起來。Try ... Catch的模式允許開發人員將可能導致例外的代碼放置在一個Try模組中。如果那個代碼確實造成了一個例外(與造成錯誤同義),就執行 Catch 模組中的代碼;這個模組中的代碼應該是設計來處理例外的。

請注意,為了向後相容,VB6中舊的錯誤處理技術( Error Resume Next及類似的)還是受到支援的,但是當你用VB.NET編寫新的應用程式時應該勇敢地爭取不使用這些舊的技術。下面的這些程式碼片段說明了VB.NET的各種錯誤處理技術:

Try
  ...
Catch
  ...
End Try

上面的代碼只是捕捉相關的Try模組中衝突代碼所導致的例外。VB.NET允許你使用多個Catch 模組來處理特殊的例外:

Try
  ...
Catch e1 as NullPointerException
  ...
Catch e2 as Exception
  ...
End Try

除了捕捉預先定義的例外,你還可以建立自己的定製例外類,這個類是從System.Exception基礎類中繼承而來的。你還可以啟用自訂例外,這與VB6中Err 對象的Raise方法相同:

If myvar < 1000 then
  Throw new Exception("Business Logic Error")
End If

靜態方法
VB.NET 允許你在類中建立靜態方法。靜態方法指的是那些不需要開發人員建立類的例示就能調用的方法。例如,如果有一個名為 Foo的類,其中有一個非靜態方法NonStatic()和一個靜態方法Static(),就可以這樣來調用 Static()方法:

Foo.Static()  

但是,非靜態方法則需要建立類的一個例示,象這樣:

'Create an instance of the Foo class
Dim objFoo as New Foo()
'Execute the NonStatic() method
objFoo.NonStatic()   

要想在一個VB.NET 類中建立一個靜態方法,只需要給方法定義加上首碼Shared關鍵字。

程式和函數
在預設狀態下,VB6中所有的程式參數都是通過引用方式(ByRef)來傳遞的,而在VB.NET的預設狀態下,這些參數是用值方式(ByVal)來傳遞的。不管程式和函數是否接收參數,當調用它們的時候都需要圓括弧。VB6中,函數傳回值使用這樣的文法:FunctionName = return_value。在VB.NET 中,你可以使用Return關鍵字以Return return_value方式來傳回值,也可以繼續使用舊的文法,它們仍然有效。

屬性文法
在VB6 中,我們使用了Property Get 和property Set/Let在類中建立屬性,它們分別出現在單獨的程式中:

Public Property Get PropertyName() as DataType
  ...
End Property
Public Property Let PropertyName(value as DataType)
  ...
End Property


在VB.NET中,Property Get 和 Property Let/Set這兩個語句被合并成一個Property語句,而不再是兩個單獨的語句。另外,在Property 語句的Set部分中,變數Value指的是使用者給指定屬性賦值時輸入的那個值。

Public [ReadOnly|WriteOnly] Property PropertyName as DataType
  Get
    Return m_var
  End Get
  
  Set
    M_var = Value
  End Set
End Property

結論
VB.NET的語義和文法都發生了一些變化,這裡所列舉的都是作為一個ASP.NET開發人員將要遇到的最重要的變化。當你用VB.NET建立ASP.NET Web頁面時,需要牢記的最重要的幾點是:

變數可以被分類,不再都是Variants。就是說,如果你需要一個Integer變數,就應該使用Dim i as Integer,而不僅僅是用Dim i。給變數分類比無分類的變數的效能要好得多。
要牢記,VB.NET要求子程式調用時在調用參數周圍加圓括弧。 這就是說Response.Write "Hello, World!" 會建置錯誤,正確的應該是Response.Write("Hello, World!")。
VB.NET 不再支援預設屬性,你必須對希望從一個對象中存取的屬性進行明確地說明。
聲明數組時要注意,VB.NET中所有數組的下限都是0,上限則是由你規定的數字。
責任編輯:小李(lisz@staff.ccidnet.com)
 

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。