ようこそ。睡眠不足なプログラマのチラ裏です。

第1回「C#とVB.NET比較 」

■中間コードによる、大文字、小文字の識別
2つの言語の違いを比較する際に、まず思い浮かぶのは、両者の構文の相違である。


まず、構文を語る上で避けて通れない大きな違いのひとつは、
C#では大文字と小文字の違いが区別されるのに対し、VB.NETでは区別されないということだ。
たとえば、VB.NETでは、次のようにコードを全て小文字で記述してもなんら問題ない。

'VB.NET
system.console.writeline("オッス、オラ悟空!")

しかし、これと同じことをC#でやろうとすると、エラーとなってしまう。
C#で正しく記述するには、次のようにしなければならない。

//C#
System.Console.WriteLine("オッス、オラ悟空!");

C#にせよ、VB.NETにせよ、ソースコードをコンパイルすると、
いずれもIL*1と呼ばれる中間コードに変換される。興味深いことに、ILは大文字と小文字の違いを区別するそうだ。
つまり、VB.NETで記述されたソースコードをコンパイルするときには、
それがILレベルで正しく処理されるよう、大文字と小文字を正しく変換しなければならない。


アルファベットとしては同じだが、大文字小文字が異なるようなPublicメソッドを
VB.NETで記述した場合、どういったことが起こるだろうか?
VB.NETでは、そのような関数は使うことはできない。関数の参照を解決できないというエラーが表示される。


PublicメソッドをC#で記述した場合はどうだろうか?
例えば、C#で記述されたLifeという名前のクラス内にOwataとowataというメソッドがあったとする。
C#で作成されたこのクラスを含むDLLを、VB.NETから参照した場合、
Lifeクラスのインスタンスを生成することができる。
しかし、VB.NET側からOwataまたはowataメソッドのいずれかを使おうとすると、
コンパイラはそれが2つのうちのどちらを呼び出すべきか判断がつかず、エラーとなる。
このような問題を回避するためには、C#でDLLを作成する際に、注意しなければならない。
具体的には、コンパイラにCLS*2準拠テストを実行するようにする必要がある。
CLSを実行すると、他の言語との互換性を維持するために必要な表記のチェックを行ってくれる。
コンパイラにCLS準拠のテストを指示するには、C#プロジェクトでAssemblyInfo.csファイルに次の記述を追加する。

[assembly: System.CLSCompliant(true)]

あるいは、C#のコマンドライン・コンパイラを使っているなら、
ソースコードファイルの各usingステートメントの後に、上の行を追加する。
こうすることで、C#コンパイラは、大文字小文字だけが違う名前を持つPublicメソッドが
クラス内に存在する場合エラーを通知してくれる。
VB.NETC#の混在など、複数言語による開発をするのであれば、
CLS準拠テストは必要不可欠となるので注意しましょー。*3

*1:Intermediate Language

*2:Common Language Specification

*3:VisualStudioは、複数言語の混在による開発が可能な、いわゆる統合開発環境であるわけですが、実際そういう現場ってどのくらいあるのだろう?あまりお目にかかったことがないです。