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

来源:岁月联盟 编辑:exp 时间:2003-07-12

變數範圍(Variable Scope) Visual Basic.NET 讓 Local 變數支援 block 範圍,也就是在迴圈或 If 等等區塊內宣告的變數在外部是看不到的,所以若程式碼撰寫如下Imports System


Namespace MyNamespace


Module MyModule
Sub Main()
Dim j as integer
For j=1 to 10
If True Then
Dim i As Integer
i=i+1
Console.WriteLine("在內部的 i= " & cstr(i))
End If
Console.WriteLine("可否使用在內部的 i= " & cstr(i))
Next j
End Sub


End Module


End Namespace
在 If 區塊外使用變數 i 會導致編譯錯誤,如下圖 若拿掉該行,便可以正確執行。

但要注意的是,雖然在區塊之外看不見變數,但變數的生命週期(lifetime)並未結束。也就是說若你重新進入該區塊,你仍然可以使用該變數。所以上述的程式碼經編譯後的執行結果如下

結構化例外處理(Structured Exception Handling)Visual Basic.NET 支援結構化例外處理,使用其他語言如 C++ 早已經使用的語法 Try...Catch...Finally 以受保護的程式區塊(protected blocks)搭配過濾(filter)的使用﹔來做例外處理。 使用原先 On Error... 這種非結構化的例外處理效率較差,並較難維護程式碼。

■ Try...Catch...Finally 的程式碼結構如下 --Try '開始結構化例外處理,在這一段裡面的程式碼可能會產生例外狀況 Catch [選擇性的過濾] '如果在 Try 程式段之中有例外發生,就會執行這裡面的程式碼 [其他的 Catch 區塊] Finally'在離開 Try 區塊之前一定會執行的程式碼 End Try
在 Try 的區塊中放有例外處理需要監控的程式碼。如果在這一個區段中執行的任何程式碼發生錯誤,執行權會傳送到 Catch 區塊中的第一行程式碼。在 Catch 區塊中可以放置處理一般例外(錯誤)的程式碼。你可以定義多個 Catch 區塊,並定義在不同的狀況下執行不同的 Catch 區塊。在 Finally 區塊可以放置結尾的程式碼,如關閉檔案,釋放物件等等。

■ 使用 Try...Catch...Finally --使用 Try...Catch...Finally 區塊可以包住可能會發生錯誤的程式碼,你可以利用巢狀(nest)的方式在例外處理中再包例外處理,在每一個區塊中宣告的變數屬於該區塊的區域變數。
程式範例如下

Function GetStringsFromFile(ByVal FileName As String) As String
Dim strTest, Strings As String
Dim Stream As StreamReader = File.OpenText(FileName) '開啟檔案


Try
While True '迴圈一直執行到 EndOfStreamException 錯誤發生
strTest = Stream.readline()
If strTest = "" Then
Throw New EndOfStreamException
End If
Strings = Strings + strTest
End While
Catch EOFExcep As EndOfStreamException
' 不需要做任何事,已經達到檔案結尾
Catch IOExcep As IOException
' 有一些錯誤發生了,回報錯誤的發生
MsgBox(IOExcep.Message)
Strings = Nothing
Finally
Stream.Close() ' 關閉檔案
End Try
Return Strings
End Function


使用正確的資料型別
在定義 subroutines 和 functions 時,可以利用 VB 提供的資料型別來定義參數,以及 function 回傳的型別
Sub DoSomething(ByVal strValue1 As String, ByVal intCount As Integer, ByRef strValue2 As String = "初始內容")
Function DoSomething(ByVal strValue1 As String, ByVal intCount As Integer, ByRef strValue2 As String = "初始內容") As String
你可以利用 Optional 關鍵字來定義可以選擇性輸入的參數,但因為 Visual Basic.NET 不再支援 IsMissing 關鍵字,所以一定要給預設值。
Function DoSomething(ByVal strValue1 As String, ByVal intCount As Integer, ByRef strValue2 As String = "初始內容"
_ Optional ByVal strType = "預設內容" As String) As String
■ 整數和長整數資料型別改變 --整數(Integer)現在是 32 bits 而不是以往的 16 bits,長整數(long) 現在是 64 bits 而不是 32 bits。這讓 VB 與其他的語言更容易合作,尤其是在呼叫 API 的時候。呼叫 API 往往要注意 bits 的長度,所以你特別要注意現在 VB 對資料型別定義的改變。

■ 轉變(Cast)到正確的資料型別 -- Visual Basic.NET 要求使用正確的資料型別,所以當你在轉換資料型別時要使用適當的函數,列表如下函數名稱傳回的資料型別 CBool(value) Boolean CByte(value)ByteCChar(value) Char CDate(value)DateCDec(value) DecimalCDbl(value) Double CInt(value)IntegerCLng(value) LongCObj(value)ObjectCShort(value) Short CSng(value)SingleCStr(value)String

使用者自訂資料結構(Structure) 在 Visual Basic.NET 使用關鍵字 Structure 來定義使用者自訂的變數結構(User-defined type UDT),且不支援 VB6 使用 Type 關鍵字。
程式碼範例如下 Structure abc
Public UserName As String
Public UserId As Integer
Dim UserAge As Integer
End Structure

...


Dim emp As abc
emp.UserAge = 30
emp.UserName = "胡百敬"
emp.UserId = 12345 在結構中的成員必須要定義存取範圍如 Public、Private 或是 Protected。你也可以使用 Dim 語句,它的預設值是 Public 存取。
< Visual Basic.NET 新增而 VB6 沒有的部分 >以下介紹純粹是 Visual Basic.NET 新增的功能,在 Visual Basic 以往的版本沒有這些功能。內容有
  • Assemblies
  • 新的簡易設定(assignment)語法
  • 繼承(Inheritance)
  • Free Threading
  • 建構子(Constructor)和解構子(Destructor)
  • Delegate

Assemblies Assembly 組成.NET 平台的應用程式。它是在 .NET 執行環境上安裝、散佈應用程式的單元,並以 .exe 或是動態連結程式庫(.dll)的方式存在。你在 Visual Basic.NET 中使用 assemblies 的內容,並加入對 assemblies 的參照,就好像在之前版本的 VB 中使用 Type library 一樣。讓 assembly 與之前的 .exe 或 .dll 檔案不同的是它會包含所有執行程式的資訊,包括 type library 以及程式會用到的相關元件等等。
在 assembly 之內包含一份 assembly manifest,有點像一個 assembly 內所有內容的清單列表,包含的資訊如下:assembly 的身分,如他的名稱、版本等等用來描述組成 assembly 的所有檔案列表,包含你為你某個 assembly(.exe 或 .dll) 建立的其他 assembly,以及圖形(bitmap) 或 Readme 檔案等等。
一個 assembly 的參照(reference),也就是所有相依的外部檔案列表 -- DLLs 或是其他你的應用程式需要的檔案,但不是你建立的。Assembly 參照同時包含了對公共的(global)或是私有的(private)物件的參照。公共的物件存在公共的 assembly 快取中,也就是其他的應用程式也可以存取得到的地方,有點像 System32 目錄。Microsoft.VisualBasic 就是一個會存在於公共 assembly 快取區的範例。私有的物件必須存在於你應用程式安裝相同的目錄或是它的子目錄。
因為 Assemblies 自我描述的資訊已經足夠,所以利用 Visaul Basic.NET 所做的應用程式不再需要 Regisry 的資訊。這可以減少 DLL 的衝突,讓你的應用程式在安裝執行時更為穩定。在大多數的狀況下,安裝 .NET 應用程式只要複製檔案到目標電腦內就可以了。

■ 使用 Assemblies -- 要使用 Assemblies 你必須要先加入對它的參照,接著利用 Imports 語法來選擇要使用的物件的命名空間(namespace)。一但參照與 imports 完成,你的應用程式就可以使用同一命名空間之下所有的 classes、屬性、方法以及其他成員。一個單一的 assembly 可以包含多個命名空間,以及每一個命名空間之下都可以有多個項目。
在 Visual Studio.NET 之內,你只要編譯應用程式就可以建立 assembly。利用 Visual Basic.NET 你同時可以建製 .exe 或 .dll 檔案,並讓支援共通語言定義(Common Language Specification)的其他語言使用。