2009-07-10 2 views
7

Hier ist eine Frage, die ich seit einiger Zeit hatte, aber nie wirklich zu fragen ...Was bedeutet global :: in den .Net-Designer-Dateien?

In einer Menge der Designer-Dateien, die Visual Studio generiert, einige der Variablen sind mit globalen :: Can vorangestellt jemand erklären was das bedeutet, was dieses Präfix macht und wo soll ich es verwenden?

Antwort

12

Mit dem globalen Namespace-Qualifikationsmerkmal können Sie auf ein Mitglied im globalen ("leeren") Namespace zugreifen.

Wenn Sie einen nicht qualifizierten Typ aufrufen (z. B. MyClass.DoSomething() anstelle von MyNamespace.MyClass.DoSomething()), wird davon ausgegangen, dass er sich im aktuellen Namespace befindet. Wie qualifizierst du den Typ, um zu sagen, dass er im globalen/leeren Namespace ist?

In diesem Codebeispiel (Konsolenanwendung) sollte sein Verhalten veranschaulichen:

using System; 

namespace MyNamespace 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      MessageWriter.Write();   // writes "MyNamespace namespace" 
      global::MessageWriter.Write(); // writes "Global namespace" 
      Console.ReadLine(); 
     } 
    } 

    // This class is in the namespace "MyNamespace" 
    public class MessageWriter 
    { 
     public static void Write() 
     { 
      Console.WriteLine("MyNamespace namespace"); 
     } 
    } 
} 

// This class is in the global namespace (i.e. no specified namespace) 
public class MessageWriter 
{ 
    public static void Write() 
    { 
     Console.WriteLine("Global namespace"); 
    } 
} 
+0

Dies beantwortet nicht die Frage, warum. Generierter Code verwendet Typen, die in Namespaces deklariert sind und weiterhin global :: verwendet werden. –

+0

@Ihar: Global wird in ähnlicher Weise verwendet, um anzugeben, dass ein Namespace kein Subnamespace sein soll ... –

+0

Nein - die Frage stellt drei Dinge: Was das bedeutet (erklärt), was dieses Präfix macht (erklärt) und wo ich sollte es verwenden (was Sie wissen werden, sobald Sie die anderen zwei Punkte verstanden haben). Ihre Frage - "Warum wird in Designer-Dateien verwendet?" Wurde vom ursprünglichen Fragesteller nicht gestellt. –

1

Von here

Wenn die linken Kennung ist global, die Suche nach der richtigen Kennung beginnt bei der globalen Namespace.

+0

Das zeigt auf die richtige Antwort. –

4

Das Präfix gibt den globalen Namespace an. Hier ein Beispiel:

namespace Bar { 
    class Gnat { } 
} 
namespace Foo { 
    namespace Bar { 
    class Gnat { } 
    } 
    class Gnus { 
    Bar.Gnat a; // Foo.Bar.Gnat 
    global::Bar.Gnat b; // Bar.Gnat 
    } 
} 

Beachten Sie, wie das Element ein vielleicht unabsichtlich auf die Foo.Bar.Gnat Klasse bezieht. Um dies zu vermeiden, verwenden Sie das Präfix global ::.

+0

Wie hängt es mit generiertem Code zusammen? In .NET-Designerklassen werden normalerweise keine Typen aus globalen Namespaces referenziert. –

+0

Der Codegenerator möchte auf die Klasse Bar.Gnat verweisen. Wenn der Code innerhalb des Foo-Namespace generiert wird, wird die Klasse Foo.Bar.Gnat referenziert, es sei denn, das Präfix global :: wird verwendet. Der Code-Generator möchte den generierten Code vor diesem Fehler schützen. Es ist ein bisschen paranoid, aber trotzdem das Richtige und wahrscheinlich ein interner Microsoft-Standard. –

3

global :: Namespace-Qualifikation wird in auto verwendet erzeugten Kollision in Art zu verhindern, durch verschachtelte Namensräume zu lösen.