Visual BasicとC#、変換ツールが存在するほど互換性の高い言語ですが、いざどちらを使うかとなると判断に困ることもあります。Visual
  BasicとC#の比較については書籍が発行されていたり、他のWebサイト上でも同様の記述はたくさんありますが、私見を書いてみました。Visual
  Studio 2015時点で比較しています。
| 項目 | VB | C# | 内容 | 経過 | |
|---|---|---|---|---|---|
| 機能有無 | 匿名メソッド | ○ | VBで同等のことをするには、メソッド内で使用する変数などをカプセル化するクラスが必要 | VS2010でVBも同等機能が追加された | |
| メソッドの引数省略 | ○ | C#ではオーバーロードで対応する。 | VS2010でC#も同等機能が追加された | ||
| Handles句 | ○ | × | C#ではメンバ変数に代入するたびに-=,+=によりハンドラの除去、追加を行わなければならない。 | ||
| yield return | ○ | yield returnで列挙に限ってコルーチンが実現できる。アーキテクチャパターンの一つであるPipe&Filterパターンを採用した場合に省メモリで見通しの良いコーディングができる | VS2012でVBも対応 | ||
| Option Strict Off | ○ | 通常 Option Strict Onにしているが、Office VBAを呼び出すような状況において型チェックを外すとシンプルに書ける。また実行環境にOfficeがなくてもOffice呼出以外の機能は使える。 | VS2010で dynamicが追加されC#でも問題解消 | ||
| With文 | ○ | × | C#では一時変数で対応する。 | ||
| 多分岐 | ○ | △ | C#の switchは使いにくい(breakが必要とか、範囲指定できないとか) | ||
| staticインポート | ○ | VBは別のクラスでモジュール名を指定しないでメンバーを呼び出せる。 | VS2015でC#も対応 | ||
| Like演算子 | ○ | × | C#は正規表現で代用 | ||
| unchecked | × | ○ | 通信プログラムなど負の数を符号無し数値に変換するときに必要となる。これがないと一旦拡張変換してビット論理積をとるなどの対応が必要になる。 | ||
| 書きやすさ | 制御構造 | ○ | × | C#は複文の時に中括弧を使う。C#は if,swithなどの制御構造を追加するときなどインデントが崩れると右括弧がどれに対応しているのかわからなくなる。 | |
| 文末・行末 | △ | × | C#はセミコロンが必要、タイピングが面倒。VBは逆に行継続文字が必要な場合がある。常にセミコロンがつきまとうC#が不便 | ||
| ラムダ式 | × | ○ | C#の記述は簡潔 | ||
| 括弧 | × | △ | VBは引数、型引数、配列のいずれも小括弧を使うので複雑に入り組んだ文で混乱しがち。C#はそれぞれ小括弧、山形括弧、かぎ括弧と分かれるので見やすい。但し、 if,whileなどに制御構造に小括弧が必要 | ||
| IDE支援 | コード補完 | ○ | VBのコード補完は高速動作、 End Subなど制御構造終端が補完された後の記述がしやすい。 | VS2013でC#も終端括弧補完 | |
| リファクタリング | ○ | C#は名前の変更だけでなく、フィールドのカプセル化・パラメータの順序変更など多くのリファクタリングが利用できる。VBは名前の変更のみ | VS2015でVBも対応 | ||
| 注意点 | 比較演算子 | - | - | VBは等号で String.EmptyとNothingを同一視する。あえて区別したいときはEqualsメソッドを使用するなどの対応が必要。便利な場面が多いがこの動作を理解していないとはまることがある。C#では上記2つを区別するので、同一視したいときはIsNullOrEmptyメソッドで対応。 | |
現在C#を主に使っています。お客様のご要望に応じてVisual Basicも使います。私が使っている範囲ではそれぞれ一長一短があり甲乙付けがたいと感じています。