第10章 名前空間とusing連載 改訂版 C#入門(1/3 ページ)

.NETの巨大なクラス・ライブラリは名前空間により編成されており、usingはその利用を容易にする。どちらもC#プログラミングにおける必修項目だ。

» 2002年10月23日 00時00分 公開
[川俣晶(http://www.autumn.org/)(株)ピーデー(http://www.piedey.co.jp/)]
連載 改訂版 C#入門
Insider.NET

 

「連載 改訂版 C#入門」のインデックス

連載目次

 本記事は、(株)技術評論社が発行する書籍『新プログラミング環境 C#がわかる+使える』から許可を得て転載したものです。同書籍に関する詳しい情報については、本記事の最後に掲載しています。

 名前空間の機能は、短いプログラムを書いているときにはありがたみを感じられないかもしれない。しかし、膨大なクラス・ライブラリを活用するために、usingの機能は不可欠である。また、そのようなライブラリを整備するためには、名前空間は必須の機能といえる。本章ではこれらの機能について解説する。

10-1 ネストする名前空間

 C#では、すでに作成済みのクラスを持ち寄って、それを利用する形でコーディングを行うことが想定されている。その際、まったく無関係に開発されたクラスを集めると、同じ名前のクラスが存在することがあり、名前の衝突というやっかいな問題が発生することがある。C#では、これを解決するために、個々のクラスは、より大きな名前空間(namespace)に所属するものと考え、名前空間を区別することで、同じ名前のクラスを使い分けられるようにしている。

 名前空間については、第2章でも取り上げているが、ここではより詳しい使い方を説明する。

 まず、名前空間はネスト可能であることに注目してみよう。List 10-1に1つの例を示す。

  1: using System;
  2:
  3: namespace Space1.Sub1
  4: {
  5:   class Class1
  6:   {
  7:     public static void test()
  8:     {
  9:       Console.WriteLine("Space1.Sub1.test() called");
 10:     }
 11:   }
 12: }
 13:
 14: namespace Space2
 15: {
 16:   namespace Sub1
 17:   {
 18:     class Class1
 19:     {
 20:       public static void test()
 21:       {
 22:         Console.WriteLine("Space2.Sub1.test() called");
 23:       }
 24:     }
 25:   }
 26: }
 27:
 28: namespace Sample001
 29: {
 30:   class Class1
 31:   {
 32:     [STAThread]
 33:     static void Main(string[] args)
 34:     {
 35:       Space1.Sub1.Class1.test();
 36:       Space2.Sub1.Class1.test();
 37:     }
 38:   }
 39: }

List 10-1

 これを実行した結果はFig.10-1のようになる。

Fig.10-1

 ここでは3〜12行目で、Space1.Sub1というネストしていない名前空間を宣言している。次に14〜26行目で、Space2という名前空間を宣言し、その内部(16〜25行目)でネストした名前空間であるSub1を宣言している。この名前空間内のメソッドを呼び出すケースでは、35〜36行目を見て分かるとおり、どちらを呼び出す場合も表記は似たようなものになる。「Space1.Sub1」のようにピリオドで区切られた名前空間はそのまま使うが、Space2内にSub1があるネストした名前空間も、「Space2.Sub1」のようにピリオド区切りで表記するので、結果的にほとんど同じに見える。実際、この2つの書式には機能的に差がない。つまり、名前空間を宣言する際、ピリオド区切りの単一の名前で書いてもよいし、ネストした名前空間として宣言してもよい。

10-2 繰り返し宣言される名前空間

 名前空間の宣言は1つのブロックにまとめなければならない制約はない。つまり、同じ名前の名前空間の宣言が何回出現してもよい。この機能は、非常に重要なものだ。例えば、クラスを100個持つ名前空間を作ろうとしたとき、すべてのクラスが1個のブロック内になければならないという制約があるとしたら、100個のクラスを1個のソース・ファイル上に記述しなければならず、ソース・コードサイズが肥大化して扱いにくくなる。だが、名前空間の宣言が分散してよければ、クラスごとに1ソース・ファイルとすることもでき、扱いやすくなる。

 実際に、同じnamesapceを2つに分けて宣言した例をList 10-2に示す。

  1: using System;
  2:
  3: namespace Space1
  4: {
  5:   class Class1
  6:   {
  7:     public static void test()
  8:     {
  9:       Console.WriteLine("Space1.Class1.test() called");
 10:     }
 11:   }
 12: }
 13:
 14: namespace Space1
 15: {
 16:   class Class2
 17:   {
 18:     public static void test()
 19:     {
 20:       Console.WriteLine("Space1.Class2.test() called");
 21:     }
 22:   }
 23: }
 24:
 25: namespace Sample002
 26: {
 27:   class Class1
 28:   {
 29:     [STAThread]
 30:     static void Main(string[] args)
 31:     {
 32:       Space1.Class1.test();
 33:       Space1.Class2.test();
 34:     }
 35:   }
 36: }

List 10-2

 これを実行した結果はFig.10-2のようになる。

Fig.10-2

 3〜12行目ではSpace1という名前の名前空間を宣言している。同じように、14〜23行目でも、Space1という名前空間を宣言している。2つに分かれているが、これは2つとも、同じ名前空間の宣言の一部として機能する。その証拠に、16行目のClass2というクラスの宣言をClass1という名前に変更するとエラーになる。なぜなら、Space1という名前空間の中において、すでに5行目でClass1という名前のクラスを宣言済みだからだ。1つの名前空間の中に、同じ名前のクラスを2つ以上持つことはできない。

       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。