こんにちは!開発現場を渡り歩く中で、古いVBのコードベースと最新のC#が混在するカオスな環境から、モダンなアーキテクチャへの移行を何度も成功させてきたシニアアーキテクトです。
「Excelのマクロ(VBA)をちょっと改造していたら、いつの間にかVB.NETの本格的なシステムを任されるようになった」
「社内に眠るレガシーなVB.NET資産を活かしつつ、最近のC#のトレンドもうまく取り入れたい」
そんなあなたに向けて、今回は「VB.NETとC#の決定的な違い」を言語仕様の深部から解き明かしていきます。
同じ.NETという土俵に立ちながら、なぜこの2つの言語は異なる進化を遂げたのか。そして、実務でどう使い分けるべきか。
ここをクリアすれば、あなたのVisual Basic (VB / VB.NET)に対する理解は一気に「実務のプロフェッショナル」の領域に到達します。さあ、一緒に扉を開けましょう!
—
1. そもそもVB.NETとC#は何が違うのか?(心構えの章)
結論から言いましょう。VB.NETとC#の本質的な能力は「全く同じ」です。
なぜなら、両方ともコンパイルされると、最終的には同じ「IL(中間言語)」という共通のバイナリに変換され、同じ.NET Runtime(CLR)の上で実行されるからです。C#で書けることは、VB.NETでもほぼ100%書けます。
では、何が違うのか? それは「人間にとっての書きやすさ(シンタックスシュガー)」と「歴史的背景」です。
- C#: プログラミング言語の王道を行くスタイル(C/C++やJavaの血筋)。記号が多く、厳格でシャープ。
- VB.NET: 人間の自然言語(英語)に近いスタイル。初心者にも優しく、大文字小文字を区別しない大らかさを持つ。
「VB.NETは古い言語だから機能が制限されている」というのは大きな誤解です。最新の.NETでも、VB.NETはしっかりとアップデートされ続けています。
—
2. 言語仕様の決定的な違いをコードで看破する
百聞は一見にしかず。実際のコードを見比べながら、両者の違いと「VB.NETの意外な実力」を確認してみましょう。
違い①:文末の「セミコロン」と「ブロックの閉じ方」
- C#: `{}` と `;` が必須。
- VB.NET: 改行が文の区切り。`End If` や `Next` でブロックを閉じる。
【VB.NETの書き方】
‘ VB.NET流の条件分岐
Dim score As Integer = 85
If score >= 80 Then
Console.WriteLine(“よくできました!”)
Else
Console.WriteLine(“もう少し頑張りましょう。”)
End If ‘ ちゃんと終わりを明示します
【C#の書き方(参考)】
// C#流の条件分岐
int score = 85;
if (score >= 80) {
Console.WriteLine(“よくできました!”);
} else {
Console.WriteLine(“もう少し頑張りましょう。”);
}
VB.NETは「英語の文章」のように読めるため、プログラミング初学者やVBA出身者でも直感的に意味を把握しやすいのが最大の強みです。
違い②:大文字・小文字の区別(Case Insensitive)
- C#: `variable` と `Variable` は別の変数として扱われます(厳格)。
- VB.NET: 大文字と小文字を区別しません(寛容)。
Dim totalCount As Integer = 10
‘ うっかり小文字で書いてしまっても…
totalcount = 20 ‘ VB.NETは同じ変数として優しく受け入れてくれます!
この仕様のおかげで、タイポによるエラーが起きにくい反面、命名規則を自分でしっかり意識しないとコードが汚くなりがちなので注意が必要です。
—
3. レガシー資産を活かす!相互運用(Interoperability)の魔力
実務で最も多い悩みが、「古いVB.NETで作られた巨大なクラスライブラリがあるけれど、新しい機能はC#で書きたい(あるいはその逆)」というケースです。
ここで感動的な事実をお伝えします。「VB.NET製のアセンブリ(DLL)をC#から呼び出すことも、C#製のDLLをVB.NETから呼び出すことも、完全に自由」です。
実践:C#からVB.NETのクラスを呼び出す例
例えば、あなたがVB.NETで書いたユーティリティクラスがあるとします。
【VB.NET側のコード(Calculator.vb)】
Public Class TaxCalculator
‘ 引数に金額を受け取り、消費税込みの金額を返すメソッド
Public Function CalculateWithTax(ByVal price As Decimal) As Decimal
Const TaxRate As Decimal = 0.1D ‘ 10%の税率
Return Math.Floor(price (1.0D + TaxRate))
End Function
End Class
これをコンパイルしてDLLにした後、まったく別のC#プロジェクトから、まるで最初からC#で書かれていたかのように呼び出せます。
【C#側のコード(Program.cs)】
// C#側からVB.NETで作ったクラスをインスタンス化!
var calculator = new TaxCalculator();
decimal finalPrice = calculator.CalculateWithTax(5000m);
Console.WriteLine($”税込価格: {finalPrice}円”);
ここがポイント:
言語の違いは単なる「見た目(方言)」の違いにすぎません。内部のCLR(共通言語ランタイム)にとっては、VBもC#も同じ「ネイティブな仲間」です。既存のVB資産を無理にすべてC#に書き換える必要など全くありません。動いている資産はそのまま活かし、新機能だけを好きな言語で追加すればいいのです。
—
4. 陥りやすい罠:「Option Strict On」の重要性
VB.NETを実務で使う上で、絶対に避けて通れない最大の罠が「型安全(Type Safety)」です。
デフォルトのVB.NETは、VBAの名残もあり、異なるデータ型同士の計算を勝手に暗黙的に変換してくれます(例:文字列の `”10″` と 数値の `5` を足して `15` にしてしまうなど)。これが大規模開発では恐ろしいバグの温床になります。
対策:必ずファイルの一番上にこれを書け!
Option Strict On
Option Explicit On
Public Class SafeProcessor
Public Sub ProcessData()
Dim textNumber As String = “100”
‘ 【NG】Option Strict On の環境下では、この暗黙の型変換はコンパイルエラーになります!
‘ Dim result As Integer = textNumber + 5
‘ 【OK】明示的に型変換(CIntなど)を行う必要があります
Dim result As Integer = CInt(textNumber) + 5
End Sub
End Class
チーフアーキテクトからのアドバイス:
プロジェクトのプロパティ、あるいはコードの先頭で必ず `Option Strict On` を有効にしてください。これにより、C#と同等レベルの厳格な型チェックが働き、ランタイムエラーを未然に防ぐことができます。これをしていないVBコードは、実務では「時限爆弾」と同じです。
—
5. まとめ:これからの時代、VB.NETとどう付き合うか?
Visual Basic (VB / VB.NET)の基礎、C#との決定的な違い、そして相互運用の仕組みについて解説してきました。
- VB.NETはC#と対立するものではなく、同じ.NETファミリーの誇り高き「方言」である。
- 文法は分かりやすく直感的だが、`Option Strict On` で厳格さを担保せよ。
- レガシーなVB資産は捨てずに、C#との相互運用でスマートにモダン化せよ。
「古い言語だから……」とコンプレックスを感じる必要は一切ありません。VB.NETの圧倒的な可読性と、最新.NET環境のパワーを組み合わせれば、どんな堅牢なシステムも構築可能です。
ここをクリアしたあなたなら、もうレガシーなマクロの呪縛から完全に解放されています。自信を持って、目の前のコードを書き換えていってください!
