2009-07-10 13 views
7

Voici une question que j'ai eu depuis un certain temps, mais jamais vraiment demandé ...Que signifie global :: dans les fichiers du concepteur .Net?

Dans beaucoup de fichiers de concepteur que Visual Studio génère certaines des variables sont préfixés avec global :: Can Quelqu'un explique ce que cela signifie, ce que fait ce préfixe et où devrais-je l'utiliser?

Répondre

12

Le qualificatif d'espace de nom global vous permet d'accéder à un membre dans l'espace de noms global ("vide").

Si vous appelez un type non qualifié (par exemple MyClass.DoSomething() plutôt que MyNamespace.MyClass.DoSomething()), il est supposé se trouver dans l'espace de noms actuel. Comment alors qualifier le type pour dire qu'il est dans l'espace de nom global/vide?

Cet exemple de code (application de la console) devrait illustrer son comportement:

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

Cela ne répond pas à la question pourquoi. Le code généré utilise les types déclarés dans les espaces de noms et toujours global :: est utilisé. –

+0

@Ihar: Global est utilisé d'une manière similaire pour spécifier qu'un espace de noms ne doit pas être un sous-espace ... –

+0

Non - la question pose trois choses: Qu'est-ce que cela signifie (expliquée), que fait ce préfixe et où devrait l'utiliser (que vous saurez une fois que vous aurez compris les deux autres points). Votre question - "pourquoi est-il utilisé dans les fichiers de concepteur" n'a pas été posée par le questionneur d'origine. –

1

De here

Lorsque l'identifiant gauche est global, la recherche de l'identifiant droit démarre à l'espace de noms global.

+0

Cela indique la bonne réponse. –

4

Le préfixe indique l'espace de noms global. Voici un exemple:

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

Notez comment le membre peut-être une référence à la classe par inadvertance de Foo.Bar.Gnat. Pour éviter cela, utilisez le préfixe global ::.

+0

Comment est-ce lié au code généré? Aucun type d'espaces de noms globaux n'est généralement référencé dans les classes de concepteur .net. –

+0

Le générateur de code veut référencer la classe Bar.Gnat. Si le code est généré à l'intérieur de l'espace de noms Foo, la classe Foo.Bar.Gnat est référencée sauf si le préfixe global :: est utilisé. Le générateur de code veut protéger le code généré de cette erreur. C'est un peu paranoïaque, mais néanmoins la bonne chose à faire, et probablement un standard Microsoft interne. –

3

qualificatif global :: espace de noms est utilisé dans généré automatiquement pour éviter une collision dans le type résoudre à travers les espaces de noms imbriqués.