Visual Basic 6/VBScript 與Visual Basic.NET 的比較(上)

来源:岁月联盟 编辑:exp 时间:2003-07-12
因為未來微軟 .NET 平台的執行環境與現今大大的不同,未來 Class 可以跨語言地繼承,也就是 VB 可以繼承 C# 的 Class 等等。原始程式碼編譯成 Managed Code,平台提供執行時期將 IL 編譯成執行碼等等。在再讓 VB 必須要脫胎換骨。所以 Visual Basic.NET 將會有絕大的改版,與以往的六個版本截然不同。

Visual Basic.NET 與以往的版本實在差別太多,在這裡無法一一詳述。僅列舉明顯且重用的部分。 < Visual Basic 6 與 Visual Basic.NET 差異的部分 >以下先介紹 VB6/Visual Basic.NET 都有的部分,但 Visual Basic.NET 改變使用方式或關鍵字更新。內容有
  • 不再使用 Set 和 Let
  • Class 的屬性撰寫
  • Subroutines 和 Functions
  • 完整的資料型態範圍
  • 宣告變數、常數和陣列
  • 變數範圍(Variable Scope)
  • 結構化例外處理(Structured Exception Handling)
  • 使用正確的資料型別
  • 使用者自訂資料結構(Structure)
不再使用 Set 和 Let 不再使用 Set 和 Let 關鍵字,除非在 class 檔案中設定屬性。因為在 Visual Basic.NET 中不再使用預設(default)屬性和方法,所以不需要靠他們來辨別,你在使用物件的方法與屬性時,若要設定變數值,一定要指明清楚。也就是原先在 VB6 若要設定變數 obj 內容為 objThis,必須要
Set obj=objThis
而接收預設屬性則可以
att=objThis 以及 att=objThis.DefaultAtt 兩種寫法
所以若 objThis 物件有一個預設屬性叫 DefaultAtt,若不寫 Set 會不清楚到底要存取 objThis 物件的參照還是 objThis.DefaultAtt 這個預設屬性。但到了 Visual Basic.NET,若你要讀取 DefaultAtt,因為沒有預設屬性的使用方式,所以只有(且一定要)以 objThis.DefaultAtt 這種寫法來讀取 DefaultAtt 屬性。
所以當你使用下列程式碼時
obj=objThis
那一定是要 objThis 這個物件參照,而不會模擬兩可。而這種寫法讓 Visual Basic.NET 的語法與 JavaScript 和 C# 的語法更為接近。
在 Visual Basic.NET 中 Class 的屬性撰寫
在 VB 6 要撰寫一個物件的屬性會利用以下的程式碼,其中 Property Get 是用來讓使用者讀取屬性,而 Property Set/Let 則是用來設定屬性,至於是要使用 Set 還是 Let 則要看賦予的屬性是物件還是一般的變數型別。
Private m_myProperty As Variant


Public Property Get myProperty() As Variant
If IsObject(m_myProperty)
Then Set myProperty = m_myProperty
Else
myProperty = m_myProperty
End If
End Property


Public Property Set myProperty(ByVal vNewValue As Variant)
Set m_myProperty = vNewValue
End Property


Public Property Let myProperty(ByVal vNewValue As Variant)
m_myProperty = vNewValue
End Property
但在 Visual Basic.NET 的程式碼要改成
Private m_myProperty As String
Public Property myProperty() As String
Get
myProperty = m_myProperty
End Get


Set
m_myProperty = Value
End Set
End Property

這個語法也是與 C# 的語法更為相似。

另外在 Visual Basic.NET 你必須要明確的利用 ReadOnly 或 WriteOnly 關鍵字來設定屬性是否為唯讀或唯寫,所以程式碼為
Public ReadOnly Property myProperty() As String
Get
myProperty = m_myProperty
End Get
End Property
或是

Public WriteOnly Property myProperty() As String
Set
m_myProperty = Value
End Se
t End Property

Subroutines 和 FunctionsVisual Basic.NET 在呼叫與使用 Subroutine 和 Function 上也有許多改變

■ 方法呼叫的語法改變 --所有的方法、Subroutine 和 Function 的呼叫都需要加上小括號,在以往若呼叫 Function 但不需要 Function 的回傳值﹔或 Function 不需要傳入參數,可以使用不加小括號的方式,或呼叫 Subroutine 不使用小括號等等是可以的,但在 Visual Basic.NET 都不再允許。 所以在 VB 6 的
datTime=Now '呼叫系統的 Now() 函數

DoSomething "par1",int2,"par3" '呼叫副函數 DoSomething,傳入三個參數 等方式要改成 datTime=Now()

DoSomething("par1",int2,"par3")
所以在 ASP+ 要注意
Response.Write "某些文字"
也要改成
Response.Write("某些文字")
■ 參數傳遞預設以 ByVal --在 VB6 參數傳遞若不設定,預設是以 ByRef 也就是傳變數位址給副函數的方式,但在 Visual Basic.NET 改成預設以 ByVal 將變數的值傳遞給副函數。
但要注意的是對 Classes 和 Interfaces 以及 array 和 string 的傳遞預設仍然是採用 ByRef

■ 使用 Return 語法 --Visual Basic.NET 不支援 VB6 為了向前相容(自 Basic 以來就存在 J )而使用的 GoSub 語法。現在 Return 語法專門用來在 Function 或 Sub 內還回控制權到呼叫者端。

完整的資料型態範圍
在 VBScript 只支援 Variant 資料型別,而在 Visual Basic.NET 所有的東西都是物件(object),包含 intrinsic 資料型別。而 Variant 型別只是一個特殊型態的物件。

Variant 型別在使用上一般比較沒有效率,但可能在某些地方用起來比較方便,例如從資料庫承接可能會傳回 NULL 的欄位,程式碼如右 Dim rec As Recordset
Set rec = New Recordset
rec.Open "Select Region From Northwind.dbo.Customers WHERE CustomerID='ALFKI'", "Provider=SQLOLEDB;Data Souce=(local);Initail Catalog=Northiwnd;User ID=sa;"
Dim res As Variant
res = rec.Fields(0)
If IsNull(res) Then
MsgBox "內容是 Null"
Else
MsgBox res
End If 在 Visual Basic.NET 的 Intrinsic 資料型別有型態 資料型態名稱大小預設值 數字Byte1 byte(8 bits) 0 Short2 bytes(16 bits) 0 Integer4 bytes(32 bits) 0 Long8 bytes(64 bits) 0 Single4 bytes(32 bits) 0.0 Double8 bytes(64 bits) 0.0 Decimal12 bytes(96 bits) 0.0Unicode 文字String "" Char 2 bytes(16 bits) ""其他型別Boolean False Date #01/01/0001 12:00:00AM# 注意,不再支援 Currency 型別,可以使用 Decimal 型別取代

宣告變數、常數和陣列
在 Visual Basic.NET 有增加一些在宣告變數、常數和陣列方面的語法,在宣告的同時可以賦予值--宣告的語句與執行的語法相似 Dim x As Integer=24
Dim y As Integer= x*24


Const My_Number=42
Const My_Number As Integer=42
Const My_String = "Hello World"
Const My_String As String = "Hello World" 注意,與 VB6 不相容的是在同一個宣告的語句中只能宣告一種型態,所以不能有下列的語法。
Dim x As Integer, y as String
也因此
Dim x,y As Integer
會宣告 x 和 y 兩個變數都是整數型別。 Dim 關鍵字也可以宣告初始化過的陣列
  Dim MyArray(20) As Integer
Dim MyArray(5) As Integer = (1,2,3,4,5)
Dim MyArray(3) As String = ("Bill", "Fred", "Mary")
陣列一定要透過 Dim 宣告,若以空的括號,內不定義數字,則該陣列可以在之後重新定義大小。ReDim 可以用來重新定義陣列的大小,但不能改變陣列的維度。
  Dim MyArray() As Integer
ReDim MyArray(20)


Dim MyArray(,,) '<---透過逗號來定義陣列的維度
ReDim MyArray(20,10,5)