2013-02-22 7 views
67

In C# sehe ich global:: ziemlich oft in automatisch generierten Code. Es ist nicht etwas, das ich jemals selbst benutzt habe, also weiß ich nicht, was der Zweck ist. Kann jemand das erklären?Was ist global ::?

+1

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

+2

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

Antwort

59

global bezieht sich auf den globalen Namespace, es kann verwendet werden, um Probleme zu lösen, wodurch Sie Typen neu definieren können. Zum Beispiel:

class foo 
{ 
    class System 
    { 

    } 

} 

Wenn Sie System verwenden sind, wo würde es lokal in der foo Klasse scoped wird, könnten Sie verwenden:

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

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 
     } 
    } 
} 
+0

Was würde passieren, wenn ich eine automatisch generierte Klasse mit einer Klasse vor dem globalen Namespace hätte und die Klasse Foo hieß? Ich hätte eine Klasse erstellt, die auch Foo hieß und auch keinen Namespace hatte? –

+0

Wenn der automatisch generierten Klasse der globale Namespace vorangestellt ist und Foo heißt, verweist global auf die Klasse im globalen Namespace. Es kann nur eine einzige Definition mit demselben Namen in einem beliebigen Namespace geben. Wenn Sie eine Instanz der Klasse innerhalb eines anderen Namensraums erstellen würden, wobei Sie eine andere Bedeutung für Foo definieren würden, würde dies den meisten lokalen Bereich erfordern. Siehe die Bearbeitung – chrisw

17

Es ist ein manchmal notwendiges Präfix, das den Root-Namespace angibt.

Es wird häufig zum generierten Code hinzugefügt, um Namenskonflikte mit Benutzercode zu vermeiden. Stellen Sie sich zum Beispiel vor, Sie hätten eine Klasse namens System, aber dann wollten Sie System.String verwenden. Sie könnten global::System.String verwenden, um zu unterscheiden.

Ich glaube, die :: stammt aus C++, wo es als Namespace-Trennzeichen verwendet wird.

In der Praxis habe ich es nie verwendet, außer beim Generieren von Code. Beachten Sie, dass Sie einige Konflikte auch mithilfe von Aliasen umgehen können. Zum Beispiel using String = System.String;

12

Das global kontextuelle Stichwort, wenn es darum geht, vor dem Operator ::, bezieht sich auf den globalen Namensraum, der der Standard-Namespace für jedes C# Programm und ist ansonsten nicht namentlich.

Der Spezifizierer global:: weist den Compiler an, nach dem Namespace oder der Klasse zu suchen, beginnend mit dem Stammverzeichnis. Sie werden es im systemgenerierten Code sehen, so dass 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.

Zum Beispiel, Sie haben Namespace A und Namespace B und Namespace B.A, wenn ich Code in Namespace B.A schreiben, die auf eine Klasse im Namespace A verweisen muss, ohne global :: Ich habe keine Möglichkeit, um zu bekommen. Wenn ich A.classname referenziere, sucht der Compiler in B.A nach dem Klassennamen. Mit global :: kann ich sagen, dass es in global :: A.classname nach dem Klassennamen suchen soll und es findet den Klassennamen am richtigen Ort.

+12

Wenn Sie Inhalte aus Online-Ressourcen nehmen, seien Sie bitte so freundlich, die richtige Zuordnung zu bieten: [MSDN] (http://msdn.microsoft.com)com/de-us/library/cc713620.aspx) und [Was ist das globale Schlüsselwort in C#] (http://blog.dmbcllc.com/what-is-the-global-keyword-in-csharp/) – Bart

+2

k .. @ Bart, danke für deinen Kommentar, den ich mir merken werde, wenn ich das nächste Mal antworte. Aber warum ist das ein Downvote? – coder

+0

Das ist nicht meins. – Bart

Verwandte Themen