本特集では、C#を学ぶ上で理解が難しい個所に焦点を当てて解説していきます。Part1では、C#を利用する上で欠かすことのできない名前空間とジェネリクスについて学んでいきます。Visual Studio 2010 Expressをインストールして作業を進めましょう。

クラスを特定する名前空間

 名前空間(name space)とは、数あるクラス群から利用するクラスを特定する仕組みです。標準の.NET Frameworkのクラスライブラリには、膨大な数のクラスが存在しています。また、外部のクラスライブラリを追加できるため、その場合はさらに多くのクラスが参照できるようになります。

 クラスライブラリ以外にも大規模プロジェクトになると、プロジェクト内で作成したクラス数が膨大になることも少なくありません。クラスの数が増えてくると、どうしてもクラス名が似ていたり、同じ名前でかぶったりしてしまいます。

図1●Aさんを呼んだら名字が同じ複数人の生徒が返事をしてしまう
図1●Aさんを呼んだら名字が同じ複数人の生徒が返事をしてしまう

 では、同じ名前のクラスが複数あるような場合に、クラスを特定するにはどのようにすればよいでしょうか。例えば、学校で生徒の名前を呼ぶ場合、名字だけで特定の生徒を呼び出そうとすると、おそらく同じ名字で重なるケースが出てくるのではないでしょうか(図1)。

 学校では、単に名字だけを呼ぶのではなく、○年○組のAさんというように名前の有効範囲を限定した上で、名前を呼んで個人を特定していると思います。このように名前の有効範囲が広いと、同じ名前でかぶるケースが多く出てきてしまうため不便なことが多くなります。これを解決するためには、何らかの方法で名前の範囲を限定する必要があります。

 同様に、クラス名も同じ名前のクラスが複数存在した場合は、目的のクラスを特定するために名前の範囲を限定する仕組みが必要になります。そのための仕組みが名前空間です。実際のソースコードで名前空間がどのように使われているのかを見てみましょう。

 Visual Studioのプロジェクトウィザードでコンソールアプリケーションを作成すると、リスト1のソースが出力されます。

リスト1●自動生成されるコード
リスト1●自動生成されるコード

 先頭の(1)の4行には、コンソールアプリケーションでよく使用するクラスライブラリの名前空間がusingディレクティブで指定されています。usingディレクティブにクラスライブラリの名前空間を指定しておくと、その配下のクラスをコード中で使用する際に省略して記述できます。例えば、コンソールアプリケーションでコンソール画面を使用した入出力を行う名前空間SystemのConsoleクラスを使用するには次の二つの記述方法があります。

 一つはusingディレクティブに名前空間Systemを指定する方法です。usingディレクティブに名前空間Systemを指定する方法では、コード中でConsoleクラスを使用するときは名前空間を省略して
Console.WriteLine("Hoge.");
のように記述できます。

 もう一つはusingディレクティブに名前空間を指定せず、使用する際に名前空間を指定する方法です。名前空間のSystemをusingディレクティブに記述しない場合は、Consoleクラスを使用する際に名前空間込みで
System.Console.WriteLine("Hoge.");
のように記述して、Consoleクラスを使用できます。このようにusingディレクティブは使用しなくても、その都度、名前空間を指定することで特定のクラスを使用できますが、コード中で何度も使用する名前空間は、usingディレクティブに指定した方が簡潔に記述できます。

 生成されたコードの(2)には「namespace」キーワードが記述されています。デフォルトでは、プロジェクトウィザードで入力したプロジェクト名が名前空間として設定されています。この名前空間は、後から別の名前空間に変更することも可能です。簡単なアプリケーションであれば、デフォルトで作られた名前空間のままでもあまり問題はありません。

 しかし作成するアプリケーションの規模が大きくなってくると、単一の名前空間ではクラスが増えすぎて整理しづらくなります。アプリケーションの機能単位や、クラスの用途などで名前空間を階層構造の形に作成することで整理するようにしましょう。

 新しく名前空間を作る上での注意点は、必ずユニークなものを付与する必要がある、ということです。特に既存の名前空間とはかぶらないようにしましょう。既存の名前空間とかぶらないようにするため、よく使われるのは「インターネットのドメイン名を逆にしたもの」+「プロジェクト名」という形式をベースとして、そこから階層構造を構築する方法です。