2013-02-22 8 views
67

C#では、自動生成コードでかなり頻繁に使用されるglobal::を参照してください。私が今までに使ったことではないので、目的が分からない。誰かがこれを説明できますか?グローバル::とは何ですか?

+1

http://stackoverflow.com/questions/3552763/why-use-global-keyword-in-net –

+2

msdnから:http://msdn.microsoft.com/en-us/library/c3ay4x3d.aspx –

答えて

59

グローバルは、グローバル名前空間を参照して、タイプを再定義できる問題を解決するために使用できます。たとえば:あなたはそれがローカルにfooのクラスにスコープされるだろうシステムを使用した場合

class foo 
{ 
    class System 
    { 

    } 

} 

は、あなたが使用できます。

global::System.Console.WriteLine("foobar"); 

はグローバル名前空間にアクセスすること。

using System; 

class Foo 
{ 
    public void baz() 
    { 
     Console.WriteLine("Foo 1"); 
    } 
} 

namespace Demo 
{ 
    class Foo 
    { 
     public void baz() 
     { 
      Console.WriteLine("Foo 2"); 
     } 
    } 

    class Program 
    { 
     protected static global::Foo bar = new global::Foo(); 

     static void Main(string[] args) 
     { 
      bar.baz(); // would write Foo 1 to console as it refers to global scope 
      Foo qux = new Foo(); 
      qux.baz(); // would write Foo 2 to the console as it refers to the Demo namespace 
     } 
    } 
} 
+0

グローバルな名前空間がプレフィックスされたクラスを持つ自動生成クラスがあり、そのクラスがFooと呼ばれていたらどうなりますか?名前空間なしでFooとも呼ばれたクラスを作成しましたか? –

+0

自動生成されたクラスの先頭にグローバル名前空間があり、Fooという名前だった場合、globalはグローバル名前空間のクラスを参照します。任意の名前空間に同じ名前の定義が1つしか存在できません。 Fooの別の意味を定義するために別の名前空間からクラスのインスタンスを作成する場合は、ローカルスコープが最も大きくなります。編集 – chrisw

17

これは、いつも必要なプレフィックスで、ルート名前空間を示します。

ユーザーコードと名前の衝突を避けるために、生成されたコードによく追加されます。

たとえば、Systemというクラスがあるとしますが、System.Stringを使用するとします。差別化のためにglobal::System.Stringを使用できます。

::は、名前空間セパレータとして使用されているC++から来ていると思います。

実際には、私はコードを生成する以外にこれを使用したことはありません。エイリアスを使用していくつかの競合を回避することもできます。たとえば、using String = System.String;

12

globalコンテンツキーワード、それは::演算子の前に来たときに、任意のC#プログラムのデフォルトの名前空間で、そうでない場合は、名前のあるグローバル名前空間を指します。

global::指定子は、ルートから始まる名前空間またはクラスの検索を開始するようにコンパイラに指示します。コードが常に動作するように、システム生成コードに表示されます。そうすれば、コードがアクセスしようとしている最上位の名前空間と同じ現在の名前空間のすぐ下に名前空間がある場合、矛盾はありません。

たとえば、ネームスペースAのクラスを参照する必要があるネームスペースB.Aにコードを書き込むと、ネームスペースAとネームスペースBとネームスペースB.Aがあります。グローバルにはアクセスできません。 A.classnameを参照すると、コンパイラはB.A.でclassnameを探します。 global ::私はglobal :: A.classnameでclassnameを探すように指示することができ、適切な場所にclassnameを見つけることができます。

+12

を参照してください。オンラインリソースからコンテンツを取得する場合は、適切な属性を提供するのに十分親切にしてください:[MSDN](http://msdn.microsoft。com/en-us/library/cc713620.aspx)と[C#のグローバルキーワードは何ですか](http://blog.dmbcllc.com/what-is-the-global-keyword-in-csharp/) – Bart

+2

k ..あなたのコメントのためのバートのおかげです。私が次回に答えているとき、私は心に留めています。しかし、なぜそのダウンボートですか? – coder

+0

それは私のものではありません。 – Bart

関連する問題