Visual Basic

<image>

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

<image>

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 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 並不完全兼容。

## 語言特性

<image>

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 著手可輕易引發他們的潛能，發揮他們在這方面的才華。

## 基本資料

- 編程范型：面向對象、事件驅動
- 發行日期：1991年
- 開發者：微軟
- 軟體版本週期：14.0
- 軟體版本週期：2015年
- 類型系統：靜態、強類型
- 軟體實現：Microsoft Visual Studio
- 受影響於：BASIC
- 施影響於：Visual Basic .NET, Gambas, REALbasic及Basic4ppc
- 作業系統：Microsoft Windows、MS-DOS
- 網站：http://msdn.microsoft.com/zh-cn/vstudio/hh388573