連載

C#入門

第10 namespaceとusing

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


namespaceやクラスの別名を宣言するusing

 namespaceは便利な機能であるが、正面からこの機能を使うと、何を指定するにもnamespaceの名前を使うことになり、表記が長くなりがちな傾向に陥る。しかし、ソースコード上の狭い範囲に着目すれば、そこから参照するnamespaceの種類も限られており、何も長い名前をいちいち書かなくても十分に分かりやすいソースを記述できる。これを支援するために、C#にはusingという機能がある。usingには、別名とデフォルトnamespaceを記述する機能がある。まず、ここでは別名機能について説明する。別名機能は、namespaceや、それに属するクラスに対して、1つの名前を宣言する機能を提供している。これによって、“ultra.super.special.long.long.name”というような長いnamespaceを頻繁に参照する場合に、もっと短い名前(例えば"longname)を付けることができる。

 実際にこの機能を使ってみた例は以下のとおりである。

 1: using System;
 2:
 3: namespace Space1.Sub1
 4: {
 5:   class Class1
 6:   {
 7:     public static void test()
 8:     {
 9:       Console.WriteLine("Space1.Sub1.Class1.test() called");
10:     }
11:   }
12: }
13:
14: namespace ConsoleApplication22
15: {
16:   using MyClass = Space1.Sub1.Class1;
17:   using MySpace1 = Space1.Sub1;
18:   using MySpace2 = Space1;
19:   // using Class1 = Space1.Sub1.Class1; // 下のClass1と名前が同じになるのでエラー
20:   // using MySpace3 = MySpace2.Sub1; // usingの対象にusingされたキーワードMySpace2は使用できないのでエラー
21:   class Class1
22:   {
23:     static void Main(string[] args)
24:     {
25:       MyClass.test();
26:       MySpace1.Class1.test();
27:       MySpace2.Sub1.Class1.test();
28:     }
29:   }
30: }
usingにより別名機能を使用したサンプル・プログラム3

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

サンプル・プログラム3の実行結果
usingにより設定した別名により、短い名前でnamespaceやクラスを参照することができる。

 usingは、クラスやメソッドの内部には記述できない。そのため、usingは16〜20行目の“namespace”宣言直後に記述している。16行目は、Space1.Sub1.Class1というクラスにMyClassという短い名前を与えている。これ以後、このnamespaceブロック内では、“MyClass”と書くだけで、“Space1.Sub1.Class1”を指定したものと等しくなる。その結果、25行目のように、“MyClass.test()”という記述によって、Space1.Sub1.Class1のtest()メソッドが呼び出される。

 17行目は、Space1.Sub1というnamespaceに、MySpace1という名前を付けている。その結果、26行目の“MySpace1.Class1.test()”という記述は、“Space1.Sub1.Class1.test()”と等しい意味を持つ。

 usingは部分的なnamespaceの指定にも使用できる。18行目のSpace1にMySpace2という別名を与えている。その結果、27行目の“MySpace2.Sub1.Class1.test()”は、“Space1.Sub1.Class1.test()”と等しい意味を持つ。

 さて、上記の3例は、C#で合法的な書式である。以下は、C#でエラーになってしまう書式を説明する。19行目に記述した例はコメント記号を取り去ってコンパイルするとエラーになる。なぜなら、別名として使ったClass1は、21行目によってすでにクラス名として宣言済みだからだ。1つのnamespace内では、同じ名前のクラスを使うことができないという原則は、別名にも適用される。

 20行目は、少しややこしいが、usingのイコール記号の右側で、usingで宣言した別名を使用することはできない、という制約である。MySpace2.Sub1のMySpace2は別名なので使用できない。この場合は“Space1.Sub1”と書けばOKである。

デフォルトのnamespaceを宣言するusing

 実は、usingというキーワードは連載の第1回目から登場している。毎回、サンプルソースの先頭にusing System;という1行が書き込まれているのを確認していただきたい。このusingは、別名ではなくデフォルトのnamespaceを宣言するusingである。

 いつも使っているConsole.WriteLineメソッドの本来のフルネームは、System.Console.WriteLineとなる。しかし、“using System;”という宣言によって、省略されたnamespaceがあった場合に補うべきnamespaceはSystemであるという指定がなされており、“System.”を省略したConsole.WriteLineという記述で、正しいメソッドの呼び出しが実現される。

 以下に、1本のソース内で完全に完結するusingの例を示す。

 1: using System;
 2:
 3: namespace Space1.Sub1
 4: {
 5:   class Class2
 6:   {
 7:     public static void test()
 8:     {
 9:       Console.WriteLine("Space1.Sub1.Class2.test()");
10:     }
11:   }
12: }
13:
14: namespace ConsoleApplication23
15: {
16:   using Space1.Sub1;
17:   class Class1
18:   {
19:     static void Main(string[] args)
20:     {
21:       Class2.test();
22:     }
23:   }
24: }
usingによりデフォルトのnamespaceを使用しているサンプル・プログラム4

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

サンプル・プログラム4の実行結果
デフォルトのnamespaceを設定することにより、クラス名に付けるnamespaceの指定を省略することができる。

 16行目の“using”で、Space1.Sub1がデフォルトのnamespaceであると宣言している。その結果、このブロックに属する21行目では、“Class2.test()”と記述するだけで、自動的にSpace1.Sub1が補われて、Space1.Sub1.Class2.test()が呼び出される。


 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 記事ランキング

本日 月間