名前空間の使用 (C# プログラミング ガイド)
C# プログラムでは、名前空間が 2 つの点で頻繁に使用されます。1 つは、.NET Framework クラスが多数のクラスを編成するために名前空間を使用するからであり、もう 1 つは、固有の名前空間を宣言すると、大型のプログラミング プロジェクトでクラス名とメソッド名のスコープを管理するのに役立つからです。
名前空間へのアクセス
C# アプリケーションは、一般に using ディレクティブのセクションから始まります。このセクションには、アプリケーションが頻繁に使用する名前空間が列挙され、包含されているメソッドを使用するたびに完全修飾名を指定しなくても済むようにします。
たとえば、次の行を記述したとします。
using System;
この場合、プログラムの開始位置で、次のコードを使用できます。
Console.WriteLine("Hello, World!");
このコードの本来の書式は次のとおりです。
System.Console.WriteLine("Hello, World!");
名前空間エイリアス
using ディレクティブ (C# リファレンス) を使用しても名前空間のエイリアスを作成することができます。たとえば、入れ子になった名前空間を含む、以前に作成した名前空間を使用する場合は、次の例のようにエイリアスを宣言して、特定の名前空間を簡単に参照することもできます。
using Co = Company.Proj.Nested; // define an alias to represent a namespace
名前空間によるスコープの制御
namespace キーワードは、スコープの宣言に使用します。プロジェクト内でスコープを作成すると、コードの編成が容易になり、グローバルに一意の型を作成できます。次の例では、入れ子関係にある 2 つの名前空間で SampleClass というクラスを定義します。.演算子 (C# リファレンス) を使用して、呼び出されるメソッドを区別します。
namespace SampleNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside SampleNamespace");
}
}
// Create a nested namespace, and define another class.
namespace NestedNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine(
"SampleMethod inside NestedNamespace");
}
}
}
class Program
{
static void Main(string[] args)
{
// Displays "SampleMethod inside SampleNamespace."
SampleClass outer = new SampleClass();
outer.SampleMethod();
// Displays "SampleMethod inside SampleNamespace."
SampleNamespace.SampleClass outer2 = new SampleNamespace.SampleClass();
outer2.SampleMethod();
// Displays "SampleMethod inside NestedNamespace."
NestedNamespace.SampleClass inner = new NestedNamespace.SampleClass();
inner.SampleMethod();
}
}
}
完全修飾名
名前空間と型には、論理階層を示す完全修飾名で表された一意のタイトルが割り当てられています。たとえば、ステートメント A.B は、A が名前空間または型の名前であり、B が A の入れ子であることを意味します。
入れ子にされたクラスと名前空間を次の例に示します。完全修飾名は、各エンティティの後のコメントとして示されています。
namespace N1 // N1
{
class C1 // N1.C1
{
class C2 // N1.C1.C2
{
}
}
namespace N2 // N1.N2
{
class C2 // N1.N2.C2
{
}
}
}
前のコードは、次のような関係になっています。
名前空間 N1 は、グローバル名前空間のメンバーです。この完全修飾名は N1 です。
名前空間 N2 は、N1 のメンバーです。この完全修飾名は N1.N2 です。
クラス C1 は N1 のメンバーです。この完全修飾名は N1.C1 です。
クラス名 C2 は、このコードで 2 回使われています。ただし、完全修飾名は異なります。C2 の最初のインスタンスは C1 の内部で宣言されているので、完全修飾名は N1.C1.C2 です。C2 の 2 番目のインスタンスは名前空間 N2 の内部で宣言されているので、完全修飾名は N1.N2.C2 です。
上のコード セグメントを使用して、次のように新しいクラス メンバー C3 を名前空間 N1.N2 に追加できます。
namespace N1.N2
{
class C3 // N1.N2.C3
{
}
}
通常、:: は、名前空間エイリアスを参照する際に使用し、global:: は、グローバル名前空間を参照する際に使用します。. は、型またはメンバーを修飾する際に使用します。
名前空間ではなく型を参照するエイリアスで :: を使用するのは誤りです。次に例を示します。
using Alias = System.Console;
class TestClass
{
static void Main()
{
// Error
//Alias::WriteLine("Hi");
// OK
Alias.WriteLine("Hi");
}
}
global という語は定義済みのエイリアスではないので、global.X には特別な意味がないことに注意してください。この語は、:: と共に使用したときにのみ特別な意味が与えられます。
global:: は常にグローバル名前空間を参照し、エイリアスを参照しないので、global という名前のエイリアスを定義すると、コンパイラ警告 CS0440 が生成されます。たとえば、次の行では警告が生成されます。
using global = System.Collections; // Warning
エイリアスで :: を使用すると、追加の型が予想外に導入されることを防ぐことができます。次に例を示します。
using Alias = System;
namespace Library
{
public class C : Alias.Exception { }
}
このコードは動作しますが、Alias という型が後で導入されると、Alias. は代わりにその型にバインドされます。Alias::Exception を使用すると、Alias は名前空間エイリアスとして扱われ、型と間違われることがなくなります。
global エイリアスの詳細については、「方法: グローバル名前空間エイリアスを使用する (C# プログラミング ガイド)」を参照してください。