連載

C#入門

第10 namespaceとusing

(株)ピーデー
川俣 晶
2001/08/25


ベータ2への切り替え

 本連載では、これまで、Visual Studio .NETの日本語版ベータ1を使用し、英語版ベータ2でも動作確認するという方法で行ってきた。しかし、今回より、Visual Studio .NET日本語版ベータ2を前提に解説とサンプルソースの記述を行うこととした。今回以降のサンプルソースは、ベータ1上での実行を保証しないので、読者の皆さんも、ベータ2への切り替えをお願いしたい。

ネストするnamespace

 C#は「コンポーネント指向のプログラム言語」だと言われるが、コンポーネント指向とは、すでに作成済みのクラスを持ち寄って、それを利用する形でコーディングを行うことを意味する。その際、まったく無関係に開発されたクラスを集めると、同じ名前のクラスが存在することがあり、名前の衝突というやっかいな問題が発生する可能性がある。これを解決するために、C#では、個々のクラスは、より大きなnamespace(名前空間)に所属するものと考え、namespaceを区別することで、同じ名前のクラスを使い分けることを可能とする。

 namespaceについては、この連載の第2回目にも取り上げているので、今回は、そこで述べなかったことを説明する。

 まず、namespaceはネスト可能であることに注目してみよう。以下に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 ConsoleApplication20
29: {
30:   class Class1
31:   {
32:     static void Main(string[] args)
33:     {
34:       Space1.Sub1.Class1.test();
35:       Space2.Sub1.Class1.test();
36:     }
37:   }
38: }
ネストしたnamespaceを使用したサンプル・プログラム1

 これを実行した結果は以下のようになる。

サンプル・プログラム1の実行結果
ネストしたnamespaceも、ピリオド区切りの単一の名前と同様に扱うことができる。

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

繰り返し宣言されるnamespace

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

 実際に、同じnamespaceを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 ConsoleApplication21
26: {
27:   class Class1
28:   {
29:     static void Main(string[] args)
30:     {
31:       Space1.Class1.test();
32:       Space1.Class2.test();
33:     }
34:   }
35: }
同じnamespaceを2つに分けて宣言したサンプル・プログラム2

 これを実行した結果は以下のようになる。

サンプル・プログラム2の実行結果
同じ名前の複数のnamespaceにクラスを分けて記述することができる。

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

 

 INDEX
  第10回 namespaceとusing
  1.ベータ2への切り替え
    2.namespaceやクラスの別名を宣言するusing
    3.不完全なnamespaceとusing
 
「C#入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間