2009-07-10 11 views
7

Ecco una domanda che ho avuto per un po 'di tempo ma non ho mai avuto il tempo di chiedere ...Che cosa significa global :: nei file di progettazione .Net?

In un bel po' di file di progettazione che Visual Studio genera alcune variabili hanno il prefisso globale :: Can qualcuno spiega cosa significa, cosa fa questo prefisso e dove dovrei usarlo?

risposta

12

Il qualificatore di spazio dei nomi globale consente di accedere a un membro nello spazio dei nomi globale ("vuoto").

Se si dovesse chiamare un tipo non qualificato (ad esempio MyClass.DoSomething() anziché MyNamespace.MyClass.DoSomething()), si presume che si trovi nello spazio dei nomi corrente. In che modo quindi qualifichi il tipo per dire che si trova nello spazio dei nomi globale/vuoto?

questo esempio di codice (console app) dovrebbe illustrare il suo comportamento:

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

Questo non risponde alla domanda perché. Il codice generato utilizza i tipi dichiarati negli spazi dei nomi e ancora globale :: viene utilizzato. –

+0

@Ihar: Global viene utilizzato in modo analogo per specificare che uno spazio dei nomi non deve essere un subnamespace ... –

+0

No - la domanda chiede tre cose: cosa significa (spiegato), cosa fa questo prefisso (spiegato) e dove dovrebbe usarlo (che saprai quando avrai compreso gli altri due punti). La tua domanda - "perché viene usata nei file del designer" non è stata posta dall'interrogante originale. –

1

Da here

Quando l'identificatore sinistra è globale, la ricerca per l'identificatore destra inizia al namespace globale.

+0

Ciò indica la risposta corretta. –

4

Il prefisso indica lo spazio dei nomi globale. Ecco un esempio:

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

Si noti come il membro di una, forse si riferisce alla classe errore nei Foo.Bar.Gnat. Per evitare ciò usa il prefisso global ::.

+0

In che modo è correlato al codice generato? Nessun tipo di spazi dei nomi globali viene fatto riferimento in genere nelle classi di progettazione .NET. –

+0

Il generatore di codice vuole fare riferimento alla classe Bar.Gnat. Se il codice viene generato all'interno dello spazio dei nomi Foo, la classe Foo.Bar.Gnat viene referenziata a meno che non venga utilizzato il prefisso globale ::. Il generatore di codice vuole proteggere il codice generato da questo errore. È un po 'paranoico, ma comunque la cosa giusta da fare, e probabilmente uno standard interno di Microsoft. –

3

qualificazione mondiale :: namespace viene utilizzato in generato automaticamente per evitare collisioni nel tipo di risolvere attraverso spazi dei nomi nidificati.