Visual Basic .NET (ヴィジュアル ベーシック ドットネット)はマイクロソフトが開発したプログラミング言語およびその処理系。VB.NETとも呼ばれる。旧来のVisual Basic(バージョン6.0まで、VB6)の後継であり、C#とほぼ同時期に.NET Frameworkおよび本格的なオブジェクト指向に対応する新しい言語として登場した。

なおVisual Studio 2005以降では、「Visual Basic .NET」や「VB.NET」という呼称ではなく、従来のように「Visual Basic」という呼称が用いられるようになっているが、6.0以前との互換性はなく、また.NETベースであることには変わりない。

## 概説

2000年代初頭、マイクロソフトの「.NET構想」を実現するためのアプリケーション開発・実行環境「.NET Framework」に対応するプログラミング言語として、C#とともにVB.NETが登場した。

C++、Java、C#などのC系言語と比較して、VB/VB.NETは文法が自然言語に近いため、プログラミング初心者にも比較的習得しやすく、また使いやすいといわれている。しかし初心者向けの言語というわけではなく、本格的なソフトウェア開発にも使用できる。

Microsoft Windows用のアプリケーション、Webアプリケーション、モバイル向けアプリケーションなどを開発できる。利用可能なVisual StudioプロジェクトテンプレートもVisual C#とほぼ同様である。

アプリケーション実行コードはWindows専用の.NET Frameworkまたはクロスプラットフォームな.NET(.NET Core)上で動作するほか、C#と同等の本格的なオブジェクト指向が取り入れられるなど、前バージョンのVisual Basic 6.0からの変更点は多く両者の互換性は低い。

VB.NETに移行できない旧VB製アプリケーションを延命するため、VB.NETリリース後も旧開発環境やランタイムのサポートが条件付きで継続された。また、VB.NETには、旧VBからの移行を容易にするアップグレードウィザードや、従来の一部機能を実現する互換ライブラリが実装されている。ただし、`Microsoft.VisualBasic.Compatibility.VB6`名前空間にあるクラスは、VB 6.0から自動的にアップグレードするツールによって使用される目的で用意されていたもので、.NET 4では非推奨となっており、また32ビットプロセスでのみサポートされている。アップグレードウィザードはVisual Studio 2010以降はサポートされていない。

VB.NETのコンパイラはマイクロソフトから無料で提供されているので、Windows付属のメモ帳等でプログラミングすることも可能だが、Visual Studioなどの統合開発環境を使うのが一般的である。マイクロソフトによるVB.NET専用の統合開発環境およびVisual C#/Visual C++なども利用可能なVisual Studio製品は、かつては旧VBと同様に有償でのみ提供されていたが、バージョン2005以降は機能制限版であるExpressエディションが、またバージョン2013以降は(利用上のライセンス制約が強いものの)Professionalエディション相当の機能を持つCommunityエディションが、それぞれ無償で配布されている。

姉妹言語であるC#やF#に比べると、VB.NETにおける同等の新しい言語機能サポートなどは遅れる傾向にある。.NET Frameworkの後継かつクロスプラットフォーム版である.NET Coreの言語サポートについても、.NET Core 1.x時点ではC#とF#のみであり、.NET Core 2.0でVB.NETのサポートが追加された。

マイクロソフトは2020年11月、.NET Coreの将来的な機能のうち、言語仕様の変更を伴うものについてはVB.NETではサポートされない可能性があることを発表した。また2023年2月、C#は.NETとともに言語仕様を進化させ続けること、F#はコミュニティと協力しながら進化させていくこと、そしてVB.NETには今後新しい言語構文を追加せず、安定性に重きを置く方針であることを発表した。

### 実行速度

旧VBはVisual C++と比較して実行速度が遅いこともあったが、.NET FrameworkベースになったVB.NETでは、コンパイラが出力するコードはVisual C#等と同じくCILと呼ばれる中間表現であり、他の.NET言語と比較して速度は遜色ない。CILは実行時にJITコンパイラにより最適化されたネイティブコードに変換される。

Visual C++のようにコンパイル時にターゲットプロセッサ固有の完全なネイティブコードを生成する方式と比べて、JIT方式は移植性が高いものの、アプリケーションの起動に多少時間がかかるなどの問題点もある。そのような問題への解決策として、.NET Frameworkや.NET Coreでは、制限付きではあるがネイティブコードを生成する事前コンパイル技術もサポートしている。

### DirectXのサポート

Direct3Dなどのマルチメディアコンポーネントを含むMicrosoft DirectXに関しては、C#やVB.NETなどの.NET言語からDirectX 9を操作するための.NETマネージ ライブラリである「Managed DirectX」が、DirectX SDKおよびDirectXエンドユーザーランタイムに同梱される形で提供されていた。なお、XNAのリリースに伴い、Managed DirectXの更新は終了したが、そのXNAもすでに更新が終了している。「Windows API Code Pack for Microsoft .NET Framework」と呼ばれるWindows APIおよびDirectXを含むCOMコンポーネントの.NET用ラッパーライブラリ、もしくはオープンソースとして開発・公開されているSlimDXライブラリやSharpDXライブラリなどを使用することで、.NET言語からもDirectX 9/10/11/12を利用することが可能だが、いずれも更新が停止しており、その後に追加された最新の機能を利用することはできない。

C++/CLIなどのグルー言語により独自のラッパーを明示的に作成することで、.NET言語からDirectXを間接的に利用することも可能である。Windowsランタイム環境であれば、C++/CXやC++/WinRTを使ってラップする方法もある。

## コード例

以下はコンソールに"Hello, World!"と出力する例である。

旧VBではコンソールアプリケーションの開発は想定されておらず、基本的にGUIアプリケーションの開発のみをサポートしていたが、VB.NETはC#と同じく.NET基本クラスライブラリの全機能にアクセスでき、より汎用的な言語となった。

## 旧Visual Basicとの比較

以下は旧VBとVB.NETの構文の類似点を示したサンプルコードである。いずれもメッセージボックスに"Hello, World"のメッセージとOKボタンを表示させるものである。

旧Visual Basicのコード例:

Visual Basic .NETのコード例:

VB.NETでは、GUIフレームワークにWindows Formsを用いるか、それともWPFを用いるかによって、使用できる`MessageBox`クラスの属する名前空間が変わってくる。

旧VBやVBScriptに実装されていた旧`MsgBox`関数などの互換機能はライブラリによってサポートされているが、以下のように`()`を使ったメソッド呼び出しの形で記述しなければならない。

### オブジェクト指向

VB6ではクラスモジュールの定義、メンバー変数やメソッドのカプセル化、インターフェイスの実装によるポリモーフィズムをサポートしていた。ただしクラスの継承はサポートせず、オブジェクト指向プログラミングを完全サポートしているとは言い難かった。VB.NETではクラス継承がサポートされ、本格的なオブジェクト指向言語となった。

### .NET Frameworkライブラリ

VB6では固有のステートメントでフォームの制御や文字列の操作をプログラミングしていたが、VB.NETではC#などと共通に使われる.NET Frameworkの標準ライブラリに従ったプログラミングが必要となった。このため、旧VBプログラマのノウハウが通用しにくい状況が生まれた。このことがVBプログラマがVB6からVB.NETへの移行が進まない原因の一つではないかとの指摘がある。

### エラー処理

VB6ではエラー発生時に`On Error GoTo`文によって、メソッド内に記述されたエラー処理にジャンプさせる方式であった。VB.NETではC#やJavaなどと同様に、`Try - Catch - Finally`による例外処理を記述できる。これによって呼び出し先メソッド内部で生じたエラーを、呼び出し元メソッドで一括して取り扱うことができるなど、プログラムの柔軟性が増した。

### 固定長文字列の廃止

他の.NET言語との互換性確保のため、固定長文字列は(基本データ型としては)サポートされなくなった。Visual Basic 6.0互換機能として`Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString`クラスが用意されているが、マルチバイト文字では正常に動作しないため、目的の出力形式にエンコードしてバイト数をカウントしてから処理するといったコーディングが必要となる。

## 歴史

バージョン7.xに限り「Visual Basic .NET」と称しているが、従来のように「Visual Basic」と名称が改められた8.0以降もVB.NETの系列であることに違いはない。Microsoft.VisualBasic.dll、vbc.exe、Visual Studio IDEのバージョン情報ダイアログに見られるように、製品バージョンおよび内部バージョンはVisual Studioと同様のバージョン番号が割り当てられている。内部バージョン13は忌み番のためスキップされた。

バージョンの履歴

| 製品名 | バージョン | 内部バージョン | リリース | 備考 |
| --- | --- | --- | --- | --- |
| Visual Basic .NET | 2002 | 7.0 | 2002年 | 言語仕様の大幅変更(完全なオブジェクト指向)。実行環境に .NET Framework 1.0 を採用。 |
| Visual Basic .NET 2003 | 2003 | 7.1 | 2003年 | .NET Framework 1.1 に対応。 |
| Visual Basic 2005 | 2005 | 8.0 | 2005年 | .NET Framework 2.0 に対応。 |
| Visual Basic 2008 | 2008 | 9.0 | 2007年 | LINQやラムダ式の導入など言語機能を強化。.NET Framework 3.5 に対応。 |
| Visual Basic 2010 | 2010 | 10.0 | 2010年 | .NET Framework 4.0 に対応。 |
| Visual Basic 2012 | 2012 | 11.0 | 2012年 | .NET Framework 4.5 に対応。Async/Awaitの導入。 |
| Visual Basic 2013 | 2013 | 12.0 | 2013年 | .NET Framework 4.5.1 に対応。 |
| Visual Basic 2015 | 2015 | 14.0 | 2015年 | .NET Framework 4.6 に対応。 |
| Visual Basic 2017 | 2017 | 15.0, 15.3, 15.5, 15.8 | 2017年 |  |
| Visual Basic 2019 | 2019 | 16.0 | 2019年 | .NET Core対応に重点を置く。 |

### Visual Basic .NET (2002) (VB.NET 7.0)

2002年に、Visual Basicを基に本格的なオブジェクト指向プログラミングの概念・機能を取り入れた新しい言語であるVisual Basic .NETの開発環境・処理系として、Microsoft Visual Studio .NET (Microsoft Visual Basic .NET) がリリースされた。VB.NETはVB6の後継言語とされ、マイクロソフト社の.NET Frameworkという新しい技術基盤に対応している。対応する.NETのバージョンは.NET Framework 1.0。

VB.NETは新たにウェブサーバ用のプログラム、Web用のプログラムが開発できるなどのネットワーク開発機能が追加された。VB6の後継といっても、豊富なデバッグ機能が追加されたり、中間コード形式の採用といった言語設計思想そのものが変わったりするなど、様々な点で大幅な機能の追加および削除が行われた。なお、VB6ではサポートされていたエディット&コンティニュー機能は、VB.NETには搭載されていなかった。

### Visual Basic .NET 2003 (VB.NET 7.1)

対応する.NETのバージョンは.NET Framework 1.1。

### Visual Basic 2005 (VB 8.0)

製品名称からは「.NET」という名前がなくなったが、上記のVB.NETと連続性がある言語である。言語仕様が強化され、C# 2.0同様にジェネリックの要素が導入されたほか、パーシャルクラスや演算子のオーバーロードなどがサポートされた。また、開発環境も大きく強化されている。

対応する.NETのバージョンは.NET Framework 2.0であるが、Visual Studio用の拡張をインストールすることで.NET Framework 3.0対応アプリケーションの開発も可能になる。

### Visual Basic 2008 (VB 9.0)

同時期にリリースされたC# 3.0に合わせて言語仕様が強化され、構造化照会構文であるLINQや、ラムダ式、匿名型などの要素が追加された。
対応する.NETのバージョンは.NET Framework 3.5(.NET 3.5は3.0および2.0の完全なスーパーセットのため、3.0および2.0のアプリケーション開発も可能となっている)。

### Visual Basic 2010 (VB 10.0)

対応する.NETのバージョンは.NET Framework 4.0(3.5、3.0、2.0での開発も可能)。

C#の言語設計者として知られるアンダース・ヘルスバーグ氏が設計に携わり、VBとC#との間の言語間の格差の低減が図られるようになった 。

### Visual Basic 2012 (VB 11.0)

.NET Framework 4.5とともに公開。Visual Studio 2012に同梱される。

C# 5.0同様、非同期プログラミングを言語仕様レベルでサポートするAsync/Await構文を導入した。

### Visual Basic 2013 (VB 12.0)

.NET Framework 4.5.1とともに公開。Visual Studio 2013に同梱される。Developer Packをインストールすることで.NET Framework 4.5.2対応アプリケーションの開発も可能になる。

### Visual Basic 2015 (VB 14.0)

2015年に.NET Framework 4.6とともに公開。Visual Studio 2015に同梱される。Roslynと呼ばれるコンパイラレイヤーにより、Visual C#と同等のIDE機能を備えるに至った。

VB 14の主要な新機能は下記のとおり。

- Null値反映演算子 `?.`
- 複数行の文字列リテラル
- `NameOf`演算子
- 文字列補間
- 行末コメント

### Visual Basic 2017 (VB 15.x)

2017年にVisual Studio 2017とともに公開。15.0、15.3、15.5、15.8のリビジョンで新しいVisual Basic 15の言語機能を拡張した。

### Visual Basic 2019 (VB 16.0)

2019年にVisual Studio 2019とともに公開。.NET Core に重点を置いた Visual Basic の最初のバージョンとなった。