この記事は,日経ソフトウエア2008年7月号の特集記事「無償のVisual Studio 2008で今すぐ始めよう!」の再録です。記事は執筆時の情報に基づいており,現在では異なる場合があります。付録DVD-ROMをお持ちでない場合は,マイクロソフトのWebサイトで入手できます。なお,2008年10月24日発売の日経ソフトウエア2008年12月号では,特集記事「Visual Studio 2008 Service Pack1 ここがスゴイ20!」を掲載し,付録DVD-ROMに「Visual Studio 2008 Express Editions with Service Pack 1」を収録しています。

 このPart3では,Part2で作成した「万年カレンダ」と同じものを,Visual C#で作成します。Part2はVisual Basic(VB)言語,Part3はC#言語で記述するので,文法は違います。しかし,どちらもオブジェクト指向の手続き型言語ですし,データ型や便利な機能が詰まっているクラスライブラリはかなりの部分が共通になっています。多くの場合は,VBのコードを1行ずつC#のコードに移すことができるのです。VBからC#へ,またはC#からVBへ,ぜひ一度,書き換え作業を体験してみてください。

コードを見比べればVBとC#の違いがわかる

 最初に,Part2の図3とリスト1で紹介した,ボタンを押すとテキストボックスに今月のカレンダを表示するサンプル・プログラムをC#で書いてみましょう。Visual C#を起動し,メニューで「ファイル」→「新しいプロジェクト」でダイアログを開き,「Windowsフォームアプリケーション」を選択します。プロジェクト名は「csCalendar2」としました。フォームにボタンを一つ,テキストボックスを一つ貼り付けます。リスト1はベースとなったVBのコードです。csCalendar2コードはリスト2のように記述します。リスト1とリスト2のコードに付いている番号は,同じ処理のところに同じ番号を振るようにしています。リスト1とリスト2を見比べながら,VBとC#の違いを見ていきましょう。

リスト1●ボタンをクリックするとテキストボックスに今月のカレンダを表示する Visual Basic(VB)のコード(vbCalendar2のForm1.vb,Part2のリスト1と同等)
リスト1●ボタンをクリックするとテキストボックスに今月のカレンダを表示する Visual Basic(VB)のコード(vbCalendar2のForm1.vb,Part2のリスト1と同等)
[画像のクリックで拡大表示]
リスト2●リスト1と同等のプログラムをVisual C#で作成したもの(csCalendar2のForm1.cs)
リスト2●リスト1と同等のプログラムをVisual C#で作成したもの(csCalendar2のForm1.cs)
[画像のクリックで拡大表示]

 (1)は定数の宣言です。VBは原則として大文字小文字を区別しないので,「Const」や「As」といったキーワードは,全部小文字で書いてもエディタが見栄えがよくなるように大文字化をしてくれます。C#は原則として大文字小文字を区別するので,「const」を「Const」と書くとエラーになります*1。型名も同じです。定数名はここで初出なので大文字小文字はどちらでもよいのですが,ここですべて大文字で「LARGE_SPACE」と書いたら,後にそれを利用するときにも,すべて大文字で記述しなければなりません。

 C#のコードで,行末に「;(セミコロン)」が付いていることにも注意してください。VBはEnterキーを押して改行コードを入れることで行の終わりを示しますが,C#では,改行コードは見た目の問題でしかなく,論理上の行の終わりを意味しません。行の終わりに「 ;」を書かないと,エラーになります。

 (2)は,フォーム上のボタンをダブルクリックして作られるイベントハンドラの宣言です。VBではサブプロシジャ(Subプロシジャ)で表現されていますが,C#では関数で表現されています。VBでは,値を戻さないサブプロシジャと値を戻す関数(Functionプロシジャ)を使い分けますが,C#では関数だけを使います。値を戻さない関数は,戻り値の型に「void」と記述して,戻り値がないことを表現します。

 (3)はローカル変数の宣言です。VBではループのカウンタに使うiとjを宣言していますが,C#ではやめました。C#ではforループの中でカウンタ変数の宣言ができ,その方が一般的な書き方だと考えたからです。

 (4)はテキストボックスの内容の消去です。VB「TextBox1」,C#で「textBox1」となっているのは,統合開発環境が自動的に付けた名前がそうだったからです。(5)は変数dtに現在の日時を格納するコードです。VBでは「Now」だけで済みますが,C#では「DateTime.Now」と記述する必要があります*2

 (6)はテキストボックスに年月の文字列を追加するコードです。VBでは文字列の連結に&演算子を,改行にvbCrLf定数を使いますが,C#では+演算子とEnvironment.NewLineを使います*3

 (7)は指定された日付がどの曜日であるかを示すDayOfWeekの値を整数型変数StartDayOfWeekに格納するコードです。VBではそのまま代入して大丈夫でしたが,C#でそのまま代入すると「 'System. DayOfWeek'を'int'に暗黙的に変換できません」というエラーになります。リスト2の(7)に示したC#のコードでは,整数型(int)にキャスト(型変換)してから代入しています。