web-dev-qa-db-ja.com

C#でグローバルキーワードを使用する理由

global::接頭辞を使用する理由を理解したいと思います。次のコードでは、ReSharperはそれを冗長であり、削除できると識別しています。

alt text

56
Paul Fryer

生成されたコードではグローバル名前空間プレフィックスを使用するのが最善です。これは、名前空間に同様の名前付きタイプが存在する状況を回避するために行われます。

System.Diagnostics.DebuggerNonUserCodeAttributeという名前のタイプを作成すると、ネームスペース内で、ReSharperがglobal::は不要であると言っていないことがわかります。コードジェネレーターは、自分の型の名前との衝突を避けたいだけです。

51

キーワードglobal::は、現在のコンテキストではなく、グローバル名前空間で始まる名前をコンパイラにバインドさせます。これは、グローバルメンバーと同じ名前を持ち、グローバルメンバーが望ましい特定のコンテキストにバインド可能なメンバーが存在する場所で必要です。

例えば

class Test {
  class System {}
  public void Example() {
    System.Console.WriteLine("here"); // Error since System binds to Test.System
    global::System.Console.WriteLine("here"); // Works
}

対応するMSDNページには、さらにいくつかの例(上記のものを含む)があります。

65
JaredPar

「グローバルコンテキストキーワードは、::演算子の前に来る場合、グローバルネームスペースを指します。グローバルネームスペースは、C#プログラムのデフォルトのネームスペースであり、それ以外は名前が付けられていません。」

ソース: https://msdn.Microsoft.com/en-us/library/cc713620.aspx

2
Shami Qureshi