.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の::演算子に相当するものは存在しない。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:C# 処理対象:言語構文

この記事と関連性の高い別の.NET TIPS
クラス名やアセンブリ名を取得するには?[C#/VB]
演算子をオーバーロードするには?[C#/VB]
as演算子とキャストの違いは?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


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

本日 月間