VB

**Visual Basic**（**VB**）是由微軟公司開發的包含環境的事件驅動程式語言。它源自於 BASIC 程式語言。VB 擁有圖形化使用者介面（GUI）和快速應用程式開發（RAD）系統，可以輕易的使用 DAO、RDO、ADO 連接資料庫，或者輕鬆的建立 ActiveX 控制項。程式設計師可以輕鬆地使用 VB 提供的組件快速建立一個應用程式。

2020 年 3 月 11 日宣佈微軟不會再開發 VB 或增加功能（Going forward, we do not plan to evolve Visual Basic as a language）。

## 發展史

### .NET Framework 引入之前

#### VB 1

1991 年 4 月，Visual Basic 1.0 for Windows 版本發布。1992 年 9 月，Visual Basic 1.0 for DOS 版本發布。這個連接程式語言和使用者介面的進步被稱為 Tripod（有些時候叫做 Ruby），最初的設計是由阿蘭・庫珀（英語：Alan Cooper）完成的。這在當時引起了很大的轟動。許多專家把 VB 的出現當做是軟體開發史上的一個具有劃時代意義的事件。以現在的眼光來看，VB1.0 版的功能其實非常的弱，但它在推出當時可是第一個「可視」的編程軟體。這使得程式設計師欣喜之極，都嘗試在 VB 的平台上進行軟體創作。

#### VB 2

1992 年 11 月，VB2.0 發布。它對於上一個版本的介面和速度都有所改善。

#### VB 3

1993 年夏天，VB3.0 發布，分為標準版和專業版。其中包含一個資料引擎，可以直接讀取 Access 資料庫。這使得 VB 的資料庫編程能力大大提高。

#### VB 4

1995 年 8 月，VB4.0 發布了 32 位版本和 16 位的版本。其中包含了對類別的支援。從 VB4 開始，逐步引入了物件導向的程式設計思想。VB 功能強大，學習簡單。而且，VB 還引入了「控制項」的概念，使得大量已經編好的 VB 程式可以被我們直接拿來使用。

Visual Basic 1.0~4.0 都必須將原始碼編譯成 VB 虛擬碼後解釋執行。

#### VB 5

1997 年 2 月，VB5.0 發布。程式設計師可以用 32 位的版本匯入由 4.0 版本建立的 16 位程式，並且能順利編譯。同時還包含了對使用者自建控制項的支援。自從 Visual Basic 5.0 以後，VB 支援編譯成本機代碼，但必須在 VB 執行庫的支援下工作。

#### VB 6

1998 年夏天，VB6.0 發布。VB6 是 VB.NET 至今仍無法完全取代的版本。

### .NET Framework 引入之後

#### VB.NET （VB7）

2001 年，Visual Basic .NET 和 .NET Framework 發布。由於其使用了新的核心和特性，所以很多 VB 的程式設計師都要覆寫程式。

2002 年 Visual Basic .NET 2002（v7.0）問世，此後 Visual Basic 包含在 Visual Studio 套裝中。

2003 年 Visual Basic .NET 2003（v7.1）推出。

#### VB 8

2004 年，微軟開放了 Visual Studio .NET 2005 的測試版本（代號 Whidbey）。包含了 .NET Framework2.0 的測試版本。2005 年 11 月 7 日 Visual Basic 2005（v8.0）發布，同時為初學者與學生提供 Visual Basic 2005 的免費簡化版本 Express Edition。原定免費使用期限一年，之後微軟宣布 Express 版本永久免費。微軟在其軟體名稱中去掉了 .NET 部分。Visual Basic 2005 的「顯著」優點是，可以直接編寫出 Windows XP 風格的控制項；但是其編寫的小程式就需要近 10MB 的記憶體。

#### VB 9

2008 年 2 月 1 日 Visual Basic 2008（v9.0）發布。

通過幾年的發展，它已成為一種專業化的開發語言和環境。使用者可用 Visual Basic 快速建立 Windows 程式，現在還可以編寫企業水平的客戶 / 伺服器程式及強大的資料庫應用程式。

#### VB 10

Visual Basic 10.0 按計劃於 2010 年 3 月 22 日隨 Visual Studio 2010 一起正式發布。

新加入的功能：

* 自動實現屬性
* 集合初始化
* 不需要在代碼斷行書寫時輸入底線「\_」
* 更好的 lambda 表達式支援
* 更好地與 Python 及 Ruby 等動態語言的互通操作

Visual Basic .NET 2002（7.0）及以後的版本執行在 .NET Framework 環境下。

#### Visual Basic 2012（VB 11.0）

#### Visual Basic 2013（VB 12.0）

#### Visual Basic 2015（VB 14.0）

Visual Basic 2015（VB 14.0）於 2015 年 7 月 20 日發布。

## 由 VB 衍生的語言

微軟開發了一系列有關 VB 的手稿語言：

* Visual Basic for Applications，即 **VBA**，包含在微軟的應用程式中（比如 Microsoft Office，常見的有 Excel），以及類似 WordPerfect Office 這樣第三方的產品裡面。VBA 這樣嵌入在各種應用程式中看起來有些矛盾，但是它的功能和 VB 一樣強大。
* VBScript 是 ASP 的預設語言，還可以用在 Windows 指令碼編寫和網頁編碼 (HTML) 中。盡管它的語法類似於 VB，但是它卻是一種完全不同的語言。VBS 不使用 VB 執行庫執行，而是由 Windows 指令碼宿主 (wscript.exe - Microsoft Windows Based Script Host) 解釋執行。這兩種語言之中的不同點影響 ASP 網站的表現。

當微軟準備開發一種新的編成工具的時候，第一決定就是利用最搶手的 VB6 來進行修改，或者就是重新組建工程開發新工具。微軟後來開發了 VB 的繼任者 Visual Basic .NET，同時也是 .NET 平台的一部分。VB.NET 編成語言是一種真正的物件導向編成語言（VB4-VB6 祇能稱為基於物件而不是物件導向，最明顯的特徵就是 VB4-VB6 都不支援類的繼承），和傳統 Visual Basic 並不完全相容。

## 語言特性

VB 的中心思想就是要便於程式設計師使用，無論是新手或者專家。VB 使用了可以簡單建立應用程式的 GUI 系統，但是又可以開發相當複雜的程式。VB 的程式是一種基於表單的視覺化組件安排的聯合，並且增加代碼來指定組建的屬性和方法。因為預設的屬性和方法已經有一部分定義在了組件內，所以程式設計師不用寫多少代碼就可以完成一個簡單的程式。過去的版本裡面 VB 程式的效能問題一直被放在檯面上討論，但是隨著電腦速度的飛速增加，關於效能的爭論已經越來越少。

表單控制項的增加和改變可以用拖放技術實現。一個排列滿控制項的工具箱用來顯示可用控制項（比如文字方塊或者按鈕）。每個控制項都有自己的屬性和事件。預設的屬性值會在控制項建立的時候提供，但是程式設計師也可以進行更改。很多的屬性值可以在執行時候隨著使用者的動作和修改進行改動，這樣就形成了一個動態的程式。舉個例子來說：表單的大小改變事件中加入了可以改變控制項位置的代碼，在執行時候每當使用者更改視窗大小，控制項也會隨之改變位置。在文字方塊中的文字改變事件中加入相應的代碼，程式就能夠在文字輸入的時候自動翻譯或者阻止某些字元的輸入。

VB 的程式可以包含一個或多個表單，或者是一個主表單和多個子表單，類別似於作業系統的樣子。有很少功能的對話方塊視窗（比如沒有最大化和最小化按鈕的表單）可以用來提供彈出功能。

VB 的組件既可以擁有使用者介面，也可以沒有。這樣一來伺服器端程式就可以處理增加的模組。

VB 使用參照計數的方法來進行垃圾收集，這個方法中包含有大量的物件，提供基本的物件導向支援。因為越來越多組建的出現，程式設計師可以選用自己需要的擴充庫。和有些語言不一樣，VB 對大小寫不敏感，但是能自動轉換關鍵詞到標準的大小寫狀態，以及強制使得符號表入口的實體的變數名稱遵循書寫規則。預設情況下字串的比較是對大小寫敏感的，但是可以關閉這個功能。

VB 使得大量的外界控制項有了自己的生存空間。大量的第三方控制項針對 VB 提供。VB 也提供了建立、使用和重用這些控制項的方法，但是由於語言問題，從一個應用程式建立另外一個並不簡單。

## 術語

在討論 Visual Basic（不包含 .NET）時，經常可以聽到以下這些術語，因此掌握這些術語的基本理解對初學者十分有幫助。

* **控制項**：簡單的說，控制項就是構成或者說建造 Visual Basic 應用程式的圖形化工具，包括表單、按鈕、核取方塊、列表框、資料控制項、表格控制項和圖片控制項等等。
* **事件**：由使用者或作業系統引發的動作，例如擊鍵、單擊滑鼠（Click）、雙擊滑鼠（DblClick）、一段時間的限制，或從埠接收資料。
* **方法**：嵌入在物件定義中的程式碼，它定義物件怎樣處理資訊並回應某事件。例如，資料庫物件有打開紀錄集並從一個記錄移動到另一個記錄的方法程式的基本元素，它含有定義其特徵的屬性，定義其任務和辨識它可以回應的事件的方法。控制項和表單是 Visual Basic 中所有物件的範例。
* **物件**：一個控制項、表單等都可被看作一個物件。
* **過程**：為完成某些特定的任務而編寫的代碼段，過程通常用於回應特定的事件，也可以當作應用程式的使用者自訂函式來使用。
* **屬性**：屬性是組成使用者介面的各物件的性質的具體描述。例如上述「物件」中所提到的尺寸、位置、顏色、寬度、高度等等都稱為控制項的屬性。屬性決定物件的外觀，有時也決定物件的行為。物件的屬性絕大部分是 VB 中已經事先定義好的，但也有的屬性是需要在應用過程中才去定義的。屬性即可為物件提供資料，也能從物件取回資訊。

## VB.NET 的變革

### VB（6.0 及以前）不擁有的特性

* 繼承：Visual Basic 5 以後，VB 雖然提供了簡化的類別支援，但仍然不能滿足程式員的需求。
* 多執行緒支援：雖然可以使用 Windows API 完成，不過穩定性與除錯都很難保證。
* 異常處理：只支援 "`On Error Goto` _line_" 語句。
* 對指標的支援非常有限。
* VB 只能支援 8 到 32 位的整數，很多語言都有無限制的支援。
* VB 不允許在任何數組記憶體在不變的變數。
* VB 不支援其它程式語言共享程式碼。

Visual Basic .NET（VB 7.0）以後的版本基本支援了上述特性。

### VB 6 與 VB.NET 比較

VB.NET 的具體變革如下：

* 子程式（函式）的定義與呼叫。
* 陣列的初值設定並且需要註明範圍。
* 函式在格式上的改變：`Date` 函式、`Time` 函式、部分數學函式部分不能直接使用，`String` 函式不能使用，`DatePart`、`DateAdd`、`DateDiff` 函式的第一個參數在定義上有所改變。
* `Set` 保留字不再使用。
* `Wend` 保留字以 `End While` 取代。
* 新增運算子：`+=`、`-=`、`/=`、`*=`、`&=`。

### 缺點

這樣大的變革一度被認為是微軟為了延長 VB 的生命力而做出的，結果把 VB 改得幾乎面目全非，成了一個類別似於 C# 的新語言。VB6 的程式幾乎無法執行在 VB.NET 中，儘管微軟針對該問題提供了「升級精靈」，也無法執行徹底的轉換。這樣，程式設計師不得不付出相當大的精力，手工轉換代碼。

2005 年，微軟宣布將不會再對非 .NET 版本的 VB 進行支援。VB 社群立即作出反應表示關心這個訊息，一些老使用者還遞交了希望能夠繼續對 VB 進行技術支援的請願書。微軟後續並不願意改變他們的決定 最終在 2008 年時微軟對從 1.0 到 6.0 的所有 Visual Basic 開發環境版本結束支援。

## 關於 VB 的爭議

### 反對者

VB 是一種充滿了爭議的語言：很多程式設計師對 VB 程式的品質有強烈的反感。很多人認為 VB 不配他們使用，認為它是一種給兒童和菜鳥程式設計師的語言。它自從設計開始就是一種簡單的語言。一些 C++ 和 Java 中的特性在 VB 中並沒有出現。在感受開發的方便和快速的同時，一些類別似於編譯時進行類別型和聲明檢查的功能在預設情況下是關閉的。這樣一些程式設計師一邊感嘆 VB 的易用性，一邊沮喪地看著一些類別似於「未定義類別型」錯誤的發生。

一些批評家認為 VB 的簡單特性使得其在未來具有傷害性。很多人自學了 VB，但是並沒有學到好的編程習慣。當 VB 進入課堂的時候，學生們不會學到很多基礎的程式技術和結構，因為很多技術已經包含在那些對使用者可見的組件裡面了。不用學習標準的編程習慣，因為 VB 具有視覺化的特性，所以導致了一些莫名其妙的代碼的產生。而且很多錯誤和警告的檢查預設情況下都是關閉的，程式設計師很難找到隱藏的錯誤。有經驗的程式設計師在用 VB 編程的時候都會把這些選項打開。

* 並不是非常簡便，它開發的程式只能執行在 Microsoft Windows 中。
* VB 不能很好地綜合 Windows 的基礎 API，很多時候要使用低階運算的「小伎倆」來進行編程。而 C 語言的低階記憶體運算比 VB 的要簡單得多。

### 支持者

但是很多 VB 的支持者解釋說 VB 的易用性就是它最大的優勢，可以讓經驗豐富的 VB 程式設計師或是剛剛懂得皮毛的人都能用自己的方式快速開發程式。而且 VB 的程式可以非常簡單的和資料庫連接。比如利用控制項可以繫結資料庫，這樣一來用 VB 寫出的程式就可以掌握資料庫的所有資訊而不用寫一行代碼。

很多語言的特性比如 `GoSub`、`On Error` 和用變數名字的最後一個字元判斷宣告類別型（比如字串型 `str$`）都是從 BASIC 中來的。VB 的語法和絕大部分語言都不同，可能會讓新的程式設計師混淆。比如宣告「`Dim a, b, c As Integer`」宣告了 `c` 為整數變數，但是 `a`,`b` 依然是 `Variant`（.NET 中 為 `Object`）類別型的。（如果想宣告 3 個 `Integer`，必須寫 `Dim a As Integer, b As Integer, c as Integer`；而直接寫 `Dim a`，後面不寫類別型，則自動變成 `Variant` 類別型 —— 占用大量資源。這個問題在 VB.NET 以後的版本已經解決，`Dim a, b, c As Integer` 的類別型都將為整數）

還有一些特性，比如底線字元 `_` 支援一行代碼分多行寫。一些程式設計師在使用的時候由於不符規範而引起錯誤。

### 總結

VB 會吸引更多的讚譽和批評，也會繼續為廣大的使用者和程式設計師使用。它比較適合用來開發提供友好介面的程式（比如針對伺服器的資料），但是不適合開發需要進行繁重運算的程式（如聯合計算程式）。

VB 對初學程式設計者是一個很好的入門軟體，尤其對一些有程式設計才能而自己也不知道的人，由 VB 著手可輕易引發他們的潛能，發揮他們在這方面的才華。

## 參考文獻

## 外部連結

* （繁體中文）MSDN 上的 VB6 支援 （頁面存檔備份，存於網際網路檔案館）
* VB6 支援
* VB 的教程（頁面存檔備份，存於網際網路檔案館）
* VB6 中文教程（頁面存檔備份，存於網際網路檔案館）
* VBGood（VB 愛好者樂園） （頁面存檔備份，存於網際網路檔案館）
* play78（VB 原始碼）
* Applevb（AppleVB）
* 部落格園 VB 團隊
* VB 原始碼分享（VB 原始碼庫）
* （繁體中文）Studio Express 首頁（下載） （頁面存檔備份，存於網際網路檔案館）