C#ではglobal::
、自動生成されたコードで非常に頻繁に使用されています。自分で使ったことのないものなので、目的がわかりません。誰かがこれを説明できますか?
4 に答える
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
}
}
}
これは、ルート名前空間を示す必要なプレフィックスです。
これは、ユーザーコードとの名前の衝突を避けるために、生成されたコードに追加されることがよくあります。
たとえば、というクラスSystem
があったが、を使用したいとしますSystem.String
。区別するために使用できますglobal::System.String
。
::
名前空間の区切り文字として使用されるC++から来ていると思います。
実際には、コードを生成する以外に、これを使用したことはありません。エイリアスを使用して、いくつかの競合を回避することもできることに注意してください。例えばusing String = System.String;
コンテキストキーワードはglobal
、::演算子の前にある場合、グローバル名前空間を参照します。これは、C#プログラムのデフォルトの名前空間であり、それ以外の場合は名前が付けられていません。
指定子は、ルートから開始して名前空間またはクラスのglobal::
検索を開始するようにコンパイラーに指示します。コードが常に機能するように、システムで生成されたコードに表示されます。そうすれば、コードがアクセスしようとしている最上位の名前空間と同じ名前空間が現在の名前空間のすぐ下にある場合、競合は発生しません。
たとえば、名前空間Aのクラスを参照する必要のあるコードを名前空間BAで記述し、グローバルなしでコードを記述した場合、名前空間A、名前空間B、および名前空間BAがあるとします。A.classnameを参照すると、コンパイラはBAでclassnameを検索します。global:: global :: A.classnameでクラス名を検索するように指示すると、適切な場所でクラス名が検索されます。
名前global::
空間とその識別子は、ほとんどの人が考えているものではありません。これは、アプリケーションで定義された名前空間の1つの外部にあり、グローバルルートに接続されている、アプリケーションで作成されたすべてのユニバーサル識別子ではありません。
トップレベルの名前空間の外部でクラスまたはタイプを作成する場合、それは自動的にGLOBAL名前空間の一部であり、global::
アプリケーションまたはアセンブリ内のすべてのファイルの識別子によってアクセス可能であると見なされます。実際、これらの名前は、そのファイルのコンパイル済みLOCALスコープにのみ存在することが多く、global::
識別子を介してアクセスできます。
aspx.csファイルにトップレベルのクラスまたは名前空間を作成するとglobal::
、そのファイルのグローバル名前空間からアクセスできます。ただしglobal::
、別のファイルを入力すると、そのクラスと名前空間はグローバル名前空間に存在しません。ただし、class.csファイルに同じクラスまたは名前空間を作成した場合、それらのアイテムはglobal::
、グローバル名前空間を介して、およびそのファイルのローカルスコープを介して、他のすべてのファイルで使用できます。なんで?
global::
実際には、ファイルのスコープの下にある最上位のLOCAL名と、アセンブリによって共有されるGLOBAL名(通常のASP.NETプロジェクトのApp_Codeクラスファイルにコンパイルされるものなど)への参照であることがわかります。
これは非常に紛らわしく、一貫性がないことがわかりました。これglobal::
は、グローバル名前空間に関連付けられているアプリケーションで作成されたトップレベルの名前空間と型へのアクセスを意味するためです。「システム」のようなものは、すべてのファイルでデフォルトでグローバル名前空間に関連付けられていますが、カスタムのものはそのファイルのスコープに依存する場合としない場合があります。そのため、グローバル識別子には、ローカルルートスコープ名への参照を解決するという二次的な役割もあります。
これをテストするには、アプリケーションの一部にトップレベルの名前空間とクラスを作成し、を使用global::
して、アプリケーションのさまざまな部分からグローバル名前空間でアクセスできるものとアクセスできないものを確認します。アクセスできないものは、そのファイル内の「ローカルグローバルスコープ」にのみ明確に割り当てられます。これglobal::
は、名前の競合でアクセスするのに役立ちます。