グローバルとは::?


116

C#ではglobal::、自動生成されたコードでよく使用されます。自分で使ったことはないので、目的が分からない。誰かがこれを説明できますか?




回答:


104

globalはグローバル名前空間を指し、タイプを再定義することによって問題を解決するために使用できます。例えば:

class foo
{
    class System
    {

    }

}

fooクラスでローカルにスコープされる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
        }
    }
}

グローバル名前空間の接頭辞が付いたクラスが自動生成されたクラスがあり、そのクラスがFooと呼ばれた場合、名前空間のないFooとも呼ばれる作成済みのクラスがあった場合はどうなりますか?
Sachin Kainth、2013

自動生成されたクラスの前にグローバル名前空間が付けられ、Fooと呼ばれた場合、グローバルはグローバル名前空間のクラスを参照します。どの名前空間でも、同じ名前の定義は1つしか存在できません。別の名前空間内からクラスのインスタンスを作成し、それによってFooに別の意味を定義した場合は、最もローカルなスコープになります。編集を見る
chrisw

26

これは、ルートネームスペースを示すために、時々必要なプレフィックスです。

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

たとえば、というクラスSystemがあり、それを使用したいとしますSystem.Stringglobal::System.String区別するために使用できます。

::名前空間の区切り文字として使用されているC ++から来ていると思います。

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


14

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

global::指定子は、ルートから始まる名前空間やクラスを探し始めるようにコンパイラに指示します。システム生成コードに表示されるため、コードは常に機能します。これにより、現在の名前空間の直下に、コードがアクセスしようとしている最上位の名前空間と同じ名前空間がある場合、競合は発生しません。

たとえば、名前空間Aのクラスを参照する必要があるコードを名前空間BAに記述した場合、名前空間A、名前空間B、名前空間BAがあるとします。A.classnameを参照する場合、コンパイラはBAでclassnameを検索し、global :: Withを使用してglobal :: A.classnameでクラス名を検索するように指示でき、適切な場所でクラス名を見つけます。


15
オンラインリソースからコンテンツを取得する場合は、適切な属性を提供できるよう十分に親切にしてください。MSDNおよびC#のグローバルキーワードとは
Bart

3
k .. @ Bartあなたのコメントに感謝します。次回回答するときに覚えておきます。
コーダー

3

global::名前空間とその識別子は、ほとんどの人が考えるものではありません。これは、アプリケーションで定義された名前空間の外側にあり、グローバルルートに接続されている、アプリケーションで作成されたすべての汎用識別子ではありません。

最上位の名前空間の外にクラスまたはタイプを作成すると、そのクラスまたはタイプは自動的にGLOBAL名前空間の一部となりglobal::、アプリケーションまたはアセンブリのすべてのファイル内の識別子によってアクセス可能になります。実際、これらの名前は、そのファイルのコンパイルされたLOCALスコープにのみ含まれることがよくありますが、global::識別子を介してアクセスできます。

aspx.csファイルでトップレベルのクラスまたは名前空間を作成するとglobal::、そのファイルのグローバル名前空間からアクセスできます。ただしglobal::、別のファイルに入力すると、そのクラスと名前空間はグローバル名前空間に存在しません。ただし、class.csファイルに同じクラスまたは名前空間を作成した場合、それらのアイテムはglobal::、グローバル名前空間を介して、およびそのファイルのローカルスコープ内の他のすべてのファイルで使用できます。どうして?

それは結局のところglobal::、実際に(典型的なASP.NETプロジェクトであなたにApp_Codeのクラスファイルにコンパイルされるかもしれないもののような)アセンブリによって、共有ファイルのスコープの下でトップレベルのローカル名を参照するだけでなく、GLOBAL名です。

global::グローバルネームスペースに関連付けられている、アプリケーションで作成されたトップレベルのネームスペースとタイプへのアクセスを意味するため、これは非常に混乱し、一貫していません。「システム」などの一部は、デフォルトですべてのファイルでグローバル名前空間に関連付けられていますが、カスタムファイルは、そのファイルのスコープによって異なる場合があります。そのため、グローバル識別子には、ローカルルートスコープ名への参照も解決するという二次的な役割があります。

これをテストするには、アプリケーションの一部に最上位の名前空間とクラスを作成し、それを使用global::して、アプリケーションのさまざまな部分からグローバル名前空間でアクセスできるものとアクセスできないものを確認します。アクセスできないものは、そのファイルのみで「ローカルグローバルスコープ」に明確に割り当てられているglobal::ため、名前の競合でアクセスするのに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.