|   | 
 
|  
 .NET TIPS 
名前空間エイリアス修飾子(::演算子)とは? グローバル名前空間とは?[2.0のみ、C#]
デジタルアドバンテージ 遠藤 孝信 
2007/03/08 | 
  | 
 
 
 
 | 
名前空間エイリアス修飾子とは?
 名前空間エイリアス修飾子(::演算子)はC# 2.0で新しく導入された演算子で、名前空間に対して定義されたエイリアス(別名)により、クラスやほかの名前空間などを修飾する場合に使用する。
 以下の例では、usingディレクティブによりSystem名前空間に対して「Sys」というエイリアスを作成している。これにより「Sys::Console.WriteLine」は「System.Console.WriteLine」と同じ意味となる。
 
using Sys = System; 
 
class Sample { 
  static void Main() { 
 
    Sys::Console.WriteLine("Hello"); // OK 
 
    System::Console.WriteLine("Hello"); // コンパイル・エラー 
    // error CS0432: エイリアス 'System'が見つかりません。 
  } 
} 
 | 
 
 
 | 
| System名前空間に対して「Sys」というエイリアスを作成した例 | 
 なお、usingディレクティブにより名前空間やクラスに対してエイリアスを作成することはC# 1.0でも可能であった。以下にその記述例を示す。
 
using Sys = System; // 名前空間のエイリアス 
using SysCon = System.Console; // クラスのエイリアス 
 
class Sample { 
  static void Main() { 
    Sys.Console.WriteLine("Hello"); // OK 
    SysCon.WriteLine("Hello"); // OK 
  } 
} 
 | 
 
 
 | 
| System名前空間のConsoleクラスに対して「SysCon」というエイリアスを作成した例 | 
 名前空間エイリアス修飾子の導入に伴い、「グローバル名前空間」に対するエイリアス「global」があらかじめ定義されている。これについて説明する前に、まずグローバル名前空間について説明しておく。
グローバル名前空間とは?
 グローバル名前空間とは最上位の名前空間であり、暗黙的に定義される無名の名前空間である。
 例えば次のように、名前空間を定義せずにクラス「MyClass」を記述した場合、MyClassクラスはグローバル名前空間に属することになる。
 
public class MyClass { // グローバル名前空間内のクラス 
  public void MyMethod() { 
    ////////// 
  } 
} 
 | 
 
 
 | 
| グローバル名前空間に属するMyClassクラス | 
 あるいは、次のようにクラスに名前空間を指定した場合には、今度はMyNamespace名前空間がグローバル名前空間に属することになる(名前空間の定義はネストさせることができる)。
 
namespace MyNamespace { // グローバル名前空間内の名前空間 
  public class MyClass { 
    public void MyMethod() { 
      ////////// 
    } 
  } 
} 
 | 
 
 
 | 
| グローバル名前空間に属するMyNamespace名前空間 | 
 この場合には、MyClassクラスは、グローバル名前空間内のMyNamespace名前空間内で定義されたクラスといえる。
名前空間エイリアス修飾子で利用できる「global」
 C# 2.0では「global」という名前で、グローバル名前空間に対するエイリアスがあらかじめ定義されている。
 例えば.NET Frameworkのクラス・ライブラリにあるSystem名前空間のConsoleクラスは、グローバル名前空間内のSystem名前空間のクラスであるため「global::System.Console」と記述できる。
 以下のサンプル・プログラムでは、Systemクラスを定義してしまっているために、WriteLineメソッドの呼び出し行でコンパイル・エラーとなる例だ。
 
class Sample { 
  public class System { // このクラスのためにエラーとなる 
    ////////// 
  } 
 
  static void Main() { 
    System.Console.WriteLine("Hello"); // コンパイル・エラー 
    // error CS0117: 'Sample.System'に 'Console'の定義がありません。 
  } 
} 
 | 
 
 
 | 
| Systemクラスの定義のためにコンパイル・エラーとなる例 | 
 このような場合には、globalと::演算子を使用して、次のように記述すればよい。
 
class Sample { 
  public class System { // このクラスがあってもOK 
    ////////// 
  } 
 
  static void Main() { 
    global::System.Console.WriteLine("Hello"); // OK 
  } 
} 
 | 
 
 
 | 
| 「global::」を使用した例 | 
 次の例はクラスに対してglobalと::演算子を使用した例である。
 
public class MyClass { 
  public static void Print() { 
    System.Console.WriteLine("global"); 
  } 
} 
 
class Sample { 
  public class MyClass { 
    public static void Print() { 
      System.Console.WriteLine("inner"); 
    } 
  } 
 
  static void Main() { 
    MyClass.Print(); // 出力:inner 
    global::MyClass.Print(); // 出力:global 
  } 
} 
 | 
 
 
 | 
| クラスに対して「global::」を使用した例 | 
 なおVisual Basic 2005では、グローバル名前空間はGlobalキーワードで表される。これにより「Global.System.Console.WriteLine(……)」や「Global.クラス名」といった記述が可能だが、C# 2.0の::演算子に相当するものは存在しない。
 
利用可能バージョン:.NET Framework 2.0のみ 
カテゴリ:C# 処理対象:言語構文
 | 
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間