矢沢久雄 文化オリエント アドバイザリースタッフ

●はじめに

 マイクロソフトは,.NETに対応した新しいプログラミング言語としてC#(シー・シャープ)を提供しています。.NETに対応するために既存のプログラミング言語の言語仕様を勝手に変更するわけにはいかないので,新しいプログラミング言語が必要だったわけです。C#は,.NETの主力開発言語となるものです。今回は,C#の特徴を説明しましょう。

●.NETに対応したプログラミング言語の特徴

 .NETでは,プログラミング言語の垣根がなくなっていますが,それを実現するために既存のプログラミング言語に若干の機能拡張が余儀なくされています。リスト1~リスト3は,画面に「IT Pro」と表示するアプリケーションを3つのプログラミング言語で記述したものです。リスト1はC#用のソース・コード(Hello.cs),リスト2はManaged C++用のソース・コード(Hello.cpp),リスト3はVisual Basic.NET用のソース・コード(Hello.vb)です。Managed C++とは,.NETに対応したC++(Visual C++.NET)のことです。Visual Basic.NETとは,.NETに対応したVisual Basic(VB)のことです。

 .NETに対応したプログラミング言語には,ネーム・スペース(クラス名の重複を防ぐもの)の宣言,クラスの定義,およびCLR(Common Language Runtime,共通言語ランタイム)が提供するクラス・ライブラリを呼び出す機能が必要になります。新しいプログラミング言語であるC#は,当然それらに対応しています。Visual BasicやVisual C++(VC++)では,若干の機能拡張を加えることで,それらに対応しています。リスト1~リスト3を見ると,プログラミング言語の種類が異なっても,記述すべき処理内容が同じであることが分かるでしょう。行末のセミコロンの有無や,ブロック(プログラムのまとまり)の表し方に違いがあるだけです。

図1●リファレンスには様々なプログラミング言語の構文が同時に示される
 画面に文字列を表示するために,同じクラス・ライブラリの機能を使っていることにも注目してください。画面に文字列を表示するためには,従来のVC++ならprintf関数を使い,VBならPrintステートメントを使います。それが,CLR上で動作する.NET対応アプリケーションでは,同じConsole.WriteLineメソッド(メソッドとはクラスが提供する関数のことです)を使うことになるのです。図1[拡大表示]は,.NET Framework SDKのリファレンスからConsole.WriteLineメソッドを検索したものです。同じメソッドを様々なプログラミング言語から呼び出すための構文がまとめて示されていることが分かるでしょう。

 .NETでプログラミング言語の垣根をなくすことができた仕組みをご理解いただけたでしょう。.NETがプログラミング言語の垣根をなくしたと言うよりは,プログラミング言語の垣根がなくなるように,既存のプログラミング言語に若干の拡張が行われたと言えるかもしれません。

●.NETではC#を使おう!

 すでにVBやVC++をお使いの方で,.NET対応のために機能拡張されたVBやVC++のソースコードに違和感を感じるなら,思い切ってC#に乗り換えることをお勧めします。新しいプログラミング言語なら違和感などありません。マイクロソフトは,C#を.NETの主力開発言語としています。Windowsで最も人気のあった開発言語はVisual Basicですが,それが.NETではC#となることを目指しているのです。

 C#は,C++をベースとして改良を加えたプログラミング言語です。変数の宣言,関数の定義,条件分岐や繰り返しの構文などは,C++とまったく同じです。JavaもC++をベースとしています。C#はJavaにもよく似ています。C言語,C++,またはJavaの経験があるなら,すぐにC#でプログラミングできるようになるはずです。参考までに,リスト4に画面に「IT Pro」と表示するJavaのソース・コード(HelloJV.java)を示しておきます。

 JavaとC#の構文があまりにも似ているので驚かれたことでしょう。Javaにできることは,基本的にC#でも実現できます。ただし,C#ならWebアプリケーションやWebサービスだけではなく,Windowsアプリケーションを作成することもできます。それが,C#の便利なところです。

●ポインタの廃止とガベージ・コレクションでプログラムの間違いを防止

 .NETに対応した様々なプログラミング言語は,構文に違いがあるだけで,それを使って実現できることは基本的に同じです。したがって,C#でなければできないということはありません。ここから先は,主にC言語やC++の経験があるプログラマを対象として,C#の特徴を説明しますが,これらは.NETに対応したすべてのプログラミング言語に共通した特徴でもあります。

 C#では,ポインタが廃止されています。ポインタとは,メモリー・アドレスを格納するための変数で,場合によっては便利なものなのですが,使い方を誤ると不正なメモリー・アクセスを引き起こし,プログラムをクラッシュさせます。C#では,危険なものは廃止してしまおうということになったのです。ただし,メソッドのパラメータにrefを指定すれば,パラメータに値を格納することができます。これは,ポインタを使ったパラメータに相当するものです。

 C言語やC++プログラマの悩みの1つに,メモリー・リークがあります。メモリー・リークとは,プログラムの実行時に確保したメモリー領域の開放を忘れると,それが残ったままとなり,いずれメモリーを圧迫してシステムがダウンしてしまうことです。C#では,CLRの持つガベージ・コレクタが常にメモリーを監視していて,不要となったメモリー領域を自動的に開放するガベージ・コレクションを行ってくれます。したがって,プログラム内でメモリーを開放しなくてもメモリー・リークが発生しません。

●使いやすいソフトウエア部品が作れる

 C#は,完全なオブジェクト指向型言語です。すべての変数と関数は,何らかのクラスの中で定義されたものでなければなりません。C#を使う限り,必然的にオブジェクト指向プログラミングができることになります。

 クラスは,再利用可能なソフトウエア部品となります。クラスで定義された変数はフィールドと呼ばれ,関数はメソッドと呼ばれます。クラスを使う側からは,フィールドをアクセスしたり,メソッドを呼び出してクラスの機能を使います。これらは,C++でも実現できることでした。ただし,C#には,ソフトウエア部品としてのクラスを,より使いやすいものとするための機能が追加されています。それは,プロパティとインデクサです。

 プロパティは,フィールドをカプセル化し,メソッドによってのみアクセスできるように制限する機能です。プロパティの実態は,フィールドをアクセスするためのメソッドなのですが,クラスを使う側からはフィールドであるかのように見えます。

 インデクサは,オブジェクトを配列のように取り扱う機能です。C#の配列はMyArray[3]のように配列のインデックスを“[”と“]”で囲んで表しますが,オブジェクトでもMyObject[3]のような表現が可能となっているのです。インデックスを指定されたオブジェクトが何を返すのかは,任意でかまいません。インデクサは,パラメータに配列のインデックスが与えられる特殊なメソッドとして定義されます。

●データ型もクラスになっている

 オブジェクト指向型言語であるSmalltalkをご存知でしょうか? Smalltalkでは,整数や文字を表すためのデータ型でさえクラスとなっていることが特徴でした。何でもかんでもクラスになっているのです。例えば,整数型の変数を宣言したら,それは単なる整数値のデータではなく,整数値を操作するメソッドを提供するクラスのインスタンス(インスタンスとはメモリー上に作成されたクラスの実体のことです。インスタンスのことをオブジェクトと呼ぶこともあります)なのです。たった数バイトの整数値のために,データとメソッドのセット(数百バイトになるでしょう)を使うのはメモリーの無駄使いだと思いませんか?

 ところが,C#でもSmalltalkと同様に,すべてのデータ型がクラスとなっているのです。ただし,常時は単なる値として取り扱われ,必要に応じてクラスに変換されるようになっています。値からクラスへの変換をボクシングと呼び,クラスから値への変換をアンボクシングと呼びます。例えば,int型の変数aを宣言して123という値を格納したら,その時点でaは単なる値です。int型に対応するのはInt32クラスです。Int32クラスには,数値の文字列表現を返すToStringメソッドがあります。いきなり,a.ToString()と記述すれば,ボクシングが行われ,aはInt32クラスのインスタンスになり,aに格納された数数値の文字列表現である“123”が返されます。

●おわりに

 C#をマスターしたいと思われるなら,.NET Framework SDKが提供するコマンドライン・コンパイラを使われることをお奨めします。テキスト・エディタを使って一言一句ソースコードを入力することが,新しいプログラミング言語をマスターするのに最良の方法だからです。ただし,実際の開発ではビジュアルな統合開発環境であるVisual Studio.NETを使うことになるでしょう。次回(最終回)は,C#を使ってWebサービスを作成する方法とWebサービスを活用する方法を説明します。