.NET Visual C#言語入門 > 名前空間(namespace)とは
のぶ亭『プログラミングの相談窓口』 … 様々なプログラミング問題を個別対応致します |
名前空間(namespace)とは
クラスを分類・管理するための機構です。名前空間のスコープを宣言すると、コードを組織化したり、グローバルに一意な型を作成したりできます。名前空間内では、以下の型を 1 つ以上宣言できます。
名前空間を明示的に指定しなくても、既定の名前空間が作成されます。作成される無名の名前空間は、グローバル名前空間とも呼ばれ、すべてのファイルに存在します。グローバル名前空間内にある識別子は、名前付き名前空間で利用できます。
名前空間は、暗黙的にパブリックにアクセスされます。この属性は変更できません。名前空間内の要素に割り当てることができるアクセス修飾子については、「アクセス修飾子」を参照してください。
名前空間は、2 つ以上の宣言で定義できます。たとえば、次の例では、MyCompany 名前空間の一部として 2 つのクラスを定義しています。
namespace MyCompany.Proj1 { class MyClass { } } namespace MyCompany.Proj1 { class MyClass1 { } }
入れ子になった名前空間で静的なメソッドを呼び出す方法の例を次に示します。
namespace SomeNameSpace { public class MyClass { static void Main() { Nested.NestedNameSpaceClass.SayHello(); } } namespace Nested { public class NestedNameSpaceClass { public static void SayHello() { Console.WriteLine("Hello"); } } } }
出力
Hello
using
using キーワードは、主に次の 2 つの場合に使用します。
-
名前空間のエイリアスを作成する場合、または他の名前空間で定義されている型をインポートする場合にディレクティブとして使用する。
- 名前空間で型の使用を許可する場合。これにより、その名前空間内では、型を修飾しないで使用できます。
- 名前空間のエイリアスを作成する場合。
- スコープを定義します。スコープの外部ではオブジェクトが破棄されます。
. 演算子
ドット演算子 (.) は、メンバ アクセスに使用します。ドット演算子は、型または名前空間のメンバを指定します。たとえば、ドット演算子を使用して、.NET Framework クラス ライブラリ内の特定のメソッドにアクセスします。
// The class Console in namespace System: System.Console.WriteLine("hello");
解説
たとえば、次のクラスを考えます。
class Simple { public int a; public void b() { } } Simple s = new Simple();
変数 s には、a と b という 2 つのメンバがあります。それらのメンバにアクセスするためにドット演算子を使用します。
s.a = 6; // assign to field a; s.b(); // invoke member function b;
ドットは修飾名にも使用します。修飾名とは、属している名前空間やインターフェイスなどを示す名前のことです。
// The class Console in namespace System: System.Console.WriteLine("hello");
using ディレクティブを使用すると、名前の修飾を省略できます。
using System; // ... System.Console.WriteLine("hello"); Console.WriteLine("hello"); // same thing
ただし、識別子があいまいな場合は、修飾する必要があります。
using System; // A namespace containing another Console class: using OtherSystem; // ... // Must qualify Console: System.Console.WriteLine( "hello" );
:: 演算子
名前空間エイリアス修飾子演算子です。
名前空間エイリアス修飾子 (::) を使用して識別子を検索できます。この例に示すように、常に 2 つの識別子の間に配置します。
global::System.Console.WriteLine("Hello World");
解説
名前空間エイリアス修飾子として global を指定できます。これにより、エイリアスを使用した名前空間ではなく、グローバル名前空間で検索が実行されます。
名前空間エイリアス修飾子を使用する
グローバル名前空間のメンバにアクセスできると、そのメンバが同名の別のエンティティによって隠される可能性がある場合に役立ちます。
//using System; この宣言が無い場合 class TestApp { public class System { } const int Console = 7; const int number = 66; static void Main() { // System名前空間のConsole型でなくTestApp.Consoleと解釈される // Console.WriteLine(number); System.Console.WriteLine(number); // エラー global::System.Console.WriteLine(number); // OK } }
左の識別子が global の場合、右の識別子の検索はグローバル名前空間から開始されます。たとえば、次の宣言は、グローバル空間のメンバとして TestApp を参照します。
class TestClass : global::TestApp
System という名前の独自の名前空間を作成することはお勧できません。そのようなコードに遭遇することはほとんどありませんが、大規模プロジェクトでは、フォームによっては名前空間の重複が実際に発生する可能性があります。そのような場合は、グローバル名前空間修飾子によって、ルート名前空間を指定できます。
使用例
次の例では、System 名前空間を使用して TestClass クラスを格納しています。そのため、System 名前空間によって隠されている System.Console クラスを参照するために global::System.Console を使用する必要があります。また、System.Collections 名前空間を参照するのに colAlias エイリアスを使用するため、名前空間の代わりにこのエイリアスを使用して System.Collections.Hashtable のインスタンスを作成しています。
using colAlias = System.Collections; namespace System { class TestClass { static void Main() { // Searching the alias: colAlias::Hashtable test = new colAlias::Hashtable(); // Add items to the table. test.Add("A", "1"); test.Add("B", "2"); test.Add("C", "3"); foreach (string name in test.Keys) { // Seaching the gloabal namespace: global::System.Console.WriteLine(name + " " + test[name]); } } } }
サンプル出力
A 1 B 2 C 3
extern エイリアス
場合によっては、同じ完全修飾型名を持つアセンブリの 2 つのバージョンを参照する必要があります。たとえば、1 つのアプリケーションでアセンブリの複数のバージョンを使用する必要がある場合などが挙げられます。外部アセンブリのエイリアスを使用すると、エイリアスで指定されているルートレベルの名前空間内に各アセンブリの名前空間をラップできます。これにより、これらの名前空間を 1 つのファイルで使用できます。
メモ
extern キーワードは、メソッドがアンマネージ コードで作成されていることを宣言する場合に、メソッドの修飾子として使用されます。
同じ完全修飾型名を持つ 2 つのアセンブリを参照するには、コマンド ラインで次のようにエイリアスを指定します。
/r:GridV1=grid.dll
/r:GridV2=grid20.dll
外部エイリアス GridV1 と GridV2 が作成されます。プログラム内からこれらのエイリアスを使用するには、extern キーワードを使用してエイリアスを参照します。次に例を示します。
extern alias GridV1;
extern alias GridV2;
それぞれの extern エイリアス宣言により追加されるルートレベルの名前空間は、グローバル名前空間と並列になりますが、グローバル名前空間内には位置しません。したがって、各アセンブリの型を参照するときに、適切な名前空間エイリアスをルートとする型の完全修飾名を使用することで、あいまいさのない状態で参照できます。
上記の例では、GridV1::Grid は grid.dll のグリッド コントロールであり、GridV2::Grid は grid20.dll のグリッド コントロールです。