C# vs VB.NET〜.NET雑感〜

戻る

■ 導入

 さて、私も送ればせながら、この前 Visual Studio .NET というものを買ってみました。
 使ってみて、非常に使いやすいツールだと思いますし、おそらくは今後、この.NETがWindowsの標準になっていくのでしょう。※1
 
 さて、.NETを買ってみると、おもに3つの言語が入っています。
 それが、VB.NET、C#、マネージC++の3つです。
 
 他にもJ#やASP.NETが入っていますが、これはJAVA経験者やサーバプログラミングをする人のためのものですので、
 とりあえず重要なのは、この3つの言語です。
 

■ Which?

 ここで、1つ疑問が湧いてくると思います。
 それは、どの言語を使うべきかという事です。
 
 もちろん、VB6を使っていた人はVBを使えばよいわけですし、C言語を使ってきた人は、C#を使えば良いわけです。※2
 しかし、両方の言語を知っている人にとっては、少し悩むかもしれません。
 
 たいてい、両方の言語を知っている人というのは、「1:VBから始めてC++に移行できた人」「2:VBからCに手を出して挫折した人」
 「3:学校でCを習った」等の人が多いと思います。
 それで挫折した人は分かると思いますが、Visual C++ 6.0 は、非常に使いづらく、覚えにくいものでした。
 私なんかも、それが嫌でBorland C++(以下BCB)に手を出したりもしましたが、結局長続きしませんでした。※3
 
(Cのポインタやクラスを覚えると、途端にC++が面白く感じはじめます。しかし、VBのString型に慣れている人間にとって、char型やCString型は面倒すぎました。)

 
■ C#は覚えやすいか?

 そこで、そういう人は、C#に対しても同じ不安を抱くわけです。
 MFCのように複雑すぎないか、新しい言語ゆえに、低機能すぎないか、またstrcpyを使わないといけないのか‥‥など。
 
 しかし、.NETについての本を読み、実際に使ってみてはっきりと感じました。
 VB.NETとC#は、ほとんど同じものです。
 
 ‥‥などと書くと語弊がありますが、実際のところ、構文と一部のコマンド以外に違いはありません。
 例えば、C#に100の機能があるとすれば、VB.NETには99の機能があります。基本的に、(難易度は違いますが、)
 C#にできてVB.NETにできない事は、ほとんどありません。その逆も然りです。
 
 それも当然のことで、.NET FrameWorkは、そういう思想で作られているからです。
 今までの、VB6とVC6の間には、日本語とフランス語並みの格差がありましたが、VB.NETとC#の違いといえば、
 文章を平仮名で書くかローマ字で書くか程度の違いしかありません。どのみち同じMSILに翻訳されます。
 
 
■ VBは覚えやすいか?

 それでは、VBはどうでしょうか?
 残念ながら、覚えにくくなっています。
 とりあえず、ここではVB6がVB.NETになってから、明らかに使いにくくなっている点を挙げてみます。

 ・完全にオブジェクト指向になったので、オブジェクト指向の知識がないと理解しにくい。
 ・フォーム間のデータの受け渡しが、やりにくくなった。
 ・PictureBoxの描画命令が、VC++でお馴染みのややこしいものに変更され、今までのものが全て使えなくなった。※4(重要)
 ・Variant型が消えた。
 ・FileListBoxコントロール、DriveListBox、DirListBoxの3兄弟が消えた。(それに代わる物は、.NETでは提供されていません。)
 ・MidB、LenB、RightBなどが消えた。(Unicode対応のため)
 ・iniファイルに対応していない。(見捨てられた。)
 ・GoTo文がない。(もっとも、ごく稀にしか使いませんが)
 ・on Error GoTo も消えた。(例外処理に取って代わられた。)
 Dim (2 To 5)ができなくなり、配列は全て0から始まるようになった。
 コントロール配列が無くなった。
 ・imageBoxが無くなった。

 ザッと見てこんなにもあります。
 しかし、これらの欠点は、C#を選んでも同じです。つまり、.NETを使う以上は、これらの欠点を避けることができないのです。
 素直に諦めるべきなのかもしれません。
 

■ VBは使いやすくなっているか?

 しかし、VBが退化しているわけでは、決してありません。
 それどころか、ものすごく便利になっています。
 
 Dim A,B,C,D,E As String という宣言ができるようになった。
 ・return 文で戻り値を返せるようになった。
 ・しつこいぐらいにポップアップしてくる「構文エラー」が、おとなしくなった。(重要)
 ・代わりに、誤りの箇所には波線が引かれるようになり、ひと目でエラーが分かるようになった。
 A += 3 とか、 str &= "ああ" などが使えるようになった。(ただし、A++などは使えない。)
 ・例外処理ができるようになった。
 Dim N As Integer = 5 ができるようになった。
 ・複数のコントロールのイベントを、同じプロシージャーに関連付けられるようになった。

 他にもありますが、とりあえずこんな感じです。
 

■ VBとC#の違うところ

 それでは、いよいよ本題に入りますが、まずは、VBとC#に対する誤解から解きたいと思います。
 ネット上でも、色々と誤解や偏見をみかけますが、これは言語を選ぶ上で、障害になります。
 まずは、それを取り除いてみようと思います。
 
誤解その1:VB.NETよりもC#の方が速い

 昔から、「BASICは遅い」と言われて来ました。今ではマシンパワーも速くなり、そんなに気にならなくなりましたが、
 それでも「VBは遅い」と言われ続けてきました。
 
 逆に、C言語は速いと言われてきました。コンパイルすると、ほとんど機械語に近いものになるのですから、
 速いのは当然です。
 
 しかし、C#も速いかといえば、それは違います。それどころか、C#の実行速度は、VB.NETと全く同じです。
 それもそのはずで、先ほども述べた通り、どちらも同じMSLIにコンパイルされます。
 .NET Frameworkでは、MSILしか受け付けません。なので、.NET Framework のマネージコードを使うのであれば、
 どの言語を使っても、実行結果・実行速度ともに同じです。VB.NETで書いてもC#で書いても、コンピュータの耳には
 MSILに翻訳された形でしか届かないのです。
 
 
誤解その2:C#はポインタが使える。

 と言っても、C#でポインタが使えないわけではありません。が、Microsoftは、C#でポインタを使うことを奨励していません。
 なぜなら、ポインタは使い方を誤ると、とんでもない事態を引き起こしてしまうものだからです。
 また、.NET Frameworkでは、常にガーベジコレクタというものが動いていて、メモリを整理してくれています。
 ガーベジコレクタは、ポインタが指し示しているアドレスの中身を変えてしまいます。なので、この2つを同時に使うことはできません。
 
 そういう理由で、C#でポインタを使う場合は、関数の前に「unsafe」(安全でないという意味)のキーワードを書かされます。
 unsafeと書かないと、ポインタは使えません。そして、unsefeと記述するということは、そのプログラムが安全でない事を意味します。
 .NETのウリである、「バグのない安全な」「スレッドセーフなコード」が、組めなくなってしまうのです。
 そして面倒なことに、「unsafe」と書かれている関数に於いては、メモリの確保&解放をユーザが行わなければなりません。
 しかし、C++とVBの両方を使っている人には分かると思いますが、メモリの確保&解放は、面倒臭い作業です。
 プログラムを「速く」開発するという観点から見ると、いちいちNew/Deleteを使うよりは、メモリの解放をガベージコレクタに
 任せた方が、開発効率が良くなります。
 また、コンパイラのプロパティも変えなければなりません。

 この通り、C#におけるポインタは、非常に不自由なものです。これを「使える」と解釈していると、後で失望することになると思います。
 

誤解その3:VB.NETはランタイムが必要だから、C#のほうがいい。

 これは大いなる誤解です。VB.NETには、今までのようなランタイムはありません。
 .NET Frameworkさえインストールしてあれば、動きます。
 そしてC#も、.NET Frameworkがないと動きません。つまり、条件は全く同じです。
 ただし、.NET Frameworkは非常に巨大です。Microsoftからダウンロードできますが、手間も時間もかかります。
 まだ、気軽に作ったものを配布できるほど、普及はしていないでしょう、
 

■ それぞれの言語の欠点

 さて、双方の言語の優れている点を挙げるのは簡単です。が、そんなものはMicrosoftの宣伝文を読めば載っています。
 そこで、ここでは敢えて、両方の言語の欠点をあげつらい、貶めて比較する方法を取ってみたいと思います。
 
【VB.NETの欠点】

 ・コードの量が多い。
  →C#のコードでは、例えばサブルーチンは、{ と }で括って示すことができます。
   Whileのループやif文の適用範囲も、{ と }で簡単に示せます。
   一方、VB.NETでは、いちいち「End If」「End While」を書かなければなりません。
 
   また、変数の宣言も、VB.NETでは少し煩雑です。
 
    Dim ABC As string.
 
   一方のC#では、非常に記述が簡潔になっています。
 
    string ABC;
 
   このように、文字の量が増え、読みにくくなる事は、BASIC言語の大きな欠点です。
   以下の2つのコードを比べてみて下さい。

'VBの場合
Public
Class HogeHoge Imprements System.Windows.Forms.Form
  Dim Param1 As Integer
  Dim Param2 As String
  Private Function Syori(ByVal A As Integer, ByRef B As String) As Integer
   '処理内容〜〜〜
  End Function
  Private Property Prop1() As Integer
  
  Get
  
    Return Param1 * 5 + Param2
    End Get
  
  Set(ByVal Value As Integer)
      Param1 = Value \ 5
      Param1 = Value Mod 5
    End Set
  End Property
End
Class
//C#の場合
public
class HogeHoge: System.Windows.Forms.Form
{
  int Param1;
  int Param2;
  private int Syori(int A,ref string B)
  {
    //処理内容〜〜〜
  }
  int Prop1
  {
    get
    {
      return Param1 * 5 + Param2;
    }
    set
    {
      Param1 = value / 5;
      Param2 = value % 5;
    }
  }
}

    VBだと、どうしても文字が多くなり、横に長くなります。
    また、この例ではクラスを使用していますが、PropertyやImprementsといった単語を覚えなければなりませんし、
    演算子のオーバーロードもできません。

 ・改行が厄介である。
  →VBで、3行にわたって文字を表示させたい場合には、以下のように記述します。
 
     Label1.Text = "1行目" & vbNewLine & "2行目" & vbNewLine & "3行目"
 
   一方のC#では、これだけで済みます。
 
     Label1.Text = "1行目\n2行目\n3行目";

(以下執筆中です。)


※1
 今までのやり方を使い続ける人もいると思いますが、Microsoftが意地を張った場合、「奨励されない方法」にされてしまう可能性があります。
 iniファイルがあっさりと見捨てられたように、今後のWindowsのバージョンUPにおいて、APIを使った方法も捨てられる可能性があります。
 消えることはないと思いますが、隠蔽されたり、非常に使いにくいものになる可能性はあります。

※2
 マネージCは、新規に.NETプロジェクトを立ち上げるのには向いていません。マネージCは難しく、C#を覚える方がラクだという意見もあります。
 MFCも使えますが、これはVC6と殆ど同じものです。

※3
 C++言語のクセの強さも原因の1つでしたが、BCBのクセの強さも原因でした。
 開発環境は重く、オートコンプリートが動くまで、1GHzマシンでも1秒かかります。カーソルがどこへでも行く(フリーカーソル固定な)上に、
 IME2003との相性も良くありません。マニュアルはMSDNに比べるとどうしても簡素ですし、入門者向けの市販の解説本は誤植だらけです。
 (なのに薄くて4000円前後×2です。)
 非常に良い開発言語だっただけに、とても残念です。

※4
 いちいちキャンバスを取得して、ペンとブラシを宣言しなければなりません。しかも、描いたものは、ウィンドウを最小化するとすぐに消えてしまいます。
 うまく使うには工夫が必要で、オブジェクトについて色々と勉強しなければなりません。
 今までのような、Picture1.Line(12,3)-(100,200) などは使えなくなり、CLS命令も消えました。