In C # global::wird es häufig in automatisch generiertem Code verwendet. Es ist nichts, was ich jemals selbst benutzt habe, also weiß ich nicht, was der Zweck ist. Kann das jemand erklären?
In C # global::wird es häufig in automatisch generiertem Code verwendet. Es ist nichts, was ich jemals selbst benutzt habe, also weiß ich nicht, was der Zweck ist. Kann das jemand erklären?
Antworten:
global bezieht sich auf den globalen Namespace. Er kann verwendet werden, um Probleme zu lösen, bei denen Sie Typen neu definieren können. Beispielsweise:
class foo
{
class System
{
}
}
Wenn Sie System dort verwenden, wo es in der foo-Klasse lokal festgelegt ist, können Sie Folgendes verwenden:
global::System.Console.WriteLine("foobar");
um auf den globalen Namespace zuzugreifen.
Beispiel
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
}
}
}
Es ist ein manchmal notwendiges Präfix, das den Root-Namespace angibt.
Es wird häufig dem generierten Code hinzugefügt, um Namenskonflikte mit dem Benutzercode zu vermeiden.
Stellen Sie sich zum Beispiel vor, Sie hätten eine Klasse namens System, aber dann wollten Sie verwenden System.String. Sie könnten global::System.Stringzur Unterscheidung verwenden.
Ich glaube, das ::kommt aus C ++, wo es als Namespace-Trennzeichen verwendet wird.
In der Praxis habe ich es nie benutzt, außer beim Generieren von Code. Beachten Sie, dass Sie einige Konflikte auch mithilfe von Aliasen umgehen können. Beispielsweiseusing String = System.String;
Das globalkontextbezogene Schlüsselwort bezieht sich vor dem Operator :: auf den globalen Namespace, der der Standardnamespace für jedes C # -Programm ist und ansonsten nicht benannt ist.
Der global::Bezeichner weist den Compiler an, ab dem Stammverzeichnis nach dem Namespace oder der Klasse zu suchen. Sie sehen es im vom System generierten Code, sodass der Code immer funktioniert. Auf diese Weise entsteht kein Konflikt, wenn Sie einen Namespace direkt unter Ihrem aktuellen Namespace haben, der dem Namespace der obersten Ebene entspricht, auf den der Code zugreifen möchte.
Angenommen, Sie haben Namespace A und Namespace B und Namespace BA, wenn ich Code in Namespace BA schreibe, der auf eine Klasse in Namespace A verweisen muss, ohne global :: Ich habe keine Möglichkeit, darauf zuzugreifen. Wenn ich auf A.classname verweise, sucht der Compiler in BA nach Klassennamen. Mit global :: kann ich ihm sagen, dass er in global :: A.classname nach Klassennamen suchen soll, und er findet den Klassennamen an der richtigen Stelle.
Der global::Namespace und seine Kennung sind nicht das, was die meisten Leute denken. Es ist keine universelle Kennung für alles, was in einer Anwendung erstellt wurde, die außerhalb eines der definierten Namespaces Ihrer Anwendung liegt und mit einem globalen Stamm verbunden ist.
Wenn Sie eine Klasse oder einen Typ außerhalb Ihrer Namespaces der obersten Ebene erstellen, wird davon ausgegangen, dass dieser automatisch Teil des GLOBAL-Namespace ist und über den der global::Bezeichner in allen Dateien in Ihrer Anwendung oder Assembly zugänglich ist . Tatsächlich befinden sich diese Namen häufiger nur im kompilierten LOCAL-Bereich dieser Datei, sind jedoch über die global::Kennung zugänglich .
Wenn Sie eine Klasse oder einen Namespace der obersten Ebene in einer aspx.cs-Datei erstellen, können Sie über global::den globalen Namespace in dieser Datei darauf zugreifen . Wenn Sie jedoch eine global::andere Datei eingeben, sind diese Klasse und dieser Namespace im globalen Namespace nicht vorhanden. Wenn Sie jedoch dieselbe Klasse oder denselben Namespace in einer class.cs-Datei erstellen, stehen diese Elemente allen anderen Dateien über global::und im globalen Namespace sowie dem lokalen Bereich dieser Dateien zur Verfügung. Warum?
Es stellt sich heraus, dass global::es sich tatsächlich um einen Verweis auf LOCAL-Namen der obersten Ebene im Dateibereich sowie auf GLOBAL-Namen handelt, die von der Assembly gemeinsam genutzt werden (wie sie möglicherweise in Ihren App_Code-Klassendateien in einem typischen ASP.NET-Projekt kompiliert werden).
Ich fand dies sehr verwirrend und nicht konsistent, da der global::Zugriff auf Namespaces und Typen der obersten Ebene impliziert wird, die in der Anwendung erstellt wurden und an den globalen Namespace gebunden sind. Einige wie "System" sind standardmäßig in allen Dateien an den globalen Namespace gebunden, benutzerdefinierte können jedoch vom Umfang dieser Datei abhängen oder nicht. Aus diesem Grund spielt der globale Bezeichner eine untergeordnete Rolle beim Auflösen von Verweisen auf Ihre lokalen Stammbereichsnamen.
Sie können dies testen, indem Sie Namespaces und Klassen der obersten Ebene in Teilen Ihrer Anwendung erstellen und dann verwenden, global::um festzustellen, auf welche Namespaces im globalen Namespace von verschiedenen Teilen Ihrer Anwendung aus zugegriffen werden kann und auf welche nicht. Diejenigen, auf die nicht zugegriffen werden kann, sind eindeutig nur in dieser Datei einem "lokalen globalen Bereich" zugeordnet, auf den global::Sie bei Namenskonflikten zugreifen können.