7
votes

Qu'est-ce que Global :: méchant dans les fichiers de concepteurs .net?

Voici une question que j'ai eu depuis un certain temps mais que je n'ai jamais eu la question de demander ...

Dans un grand nombre de fichiers de concepteurs que Visual Studio génère certaines des variables sont préfixées avec Global :: Peut-on expliquer à quelqu'un ce que cela signifie, ce que ce préfixe fait et où dois-je l'utiliser?


0 commentaires

4 Réponses :


1
votes

de ici

lorsque l'identifiant gauche est global, la recherche du bon identifiant commence à l'espace de noms global.


0 commentaires

4
votes

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


2 commentaires

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


Le générateur de code veut faire référence à 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 à moins que le préfixe global :: Le préfixe est utilisé. Le générateur de code souhaite 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 une norme Microsoft interne.



12
votes

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

Si vous deviez appeler un type non qualifié (par exemple, myClass.Dosomething () plutôt que myNamespace.myclass.dosomething.fr ), alors il est supposé être dans l'espace de noms actuel. Comment puis-tu qualifier le type pour dire que c'est dans l'espace de noms global / vide? P>

Cet échantillon de code (l'application de console) doit illustrer son comportement: P>

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");
    }
}


6 commentaires

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


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


Non - la question pose trois choses: ce que cela signifie (expliqué) ce que ce préfixe fait (expliqué) et où je devrais l'utiliser (que vous saurez une fois que vous avez compris les deux autres points). Votre question - "Pourquoi est-il utilisé dans les fichiers de concepteurs" n'a pas été demandé par le questionneur d'origine.


@Lhar: Oups - frapper un peu tôt là-bas. Je voulais ajouter, comme le dit Arjan, il est de s'assurer qu'il n'y a pas de classe avec des espaces de sous-noms. par exemple. Si le concepteur fait référence à un type, System.Resources.resourcemanager dans une classe autogénérée dans l'espace de noms myProject.Library, alors la raison pour laquelle il le préfixe avec global est juste au cas où il y a un type myProject.library.system.resources.resourcemanager. Sinon, ce deuxième type serait utilisé par inadvertance par le concepteur.


@ROB Eh bien, votre point est correct. Calanus a accepté la réponse, alors je suppose que sa curiosité est satisfaite. Mais ce n'est pas le cas dans le code généré. Avez-vous déjà vu des types d'espace de noms global référencé dans les fichiers de concepteurs .NET? La raison d'utiliser Global :: Qualifier est d'empêcher la collision de type Résolution du type lors de la recherche d'espaces de noms imbriqués.


@Lhar - ha ha - je saisis juste la seconde moitié d'une réponse lorsque vous m'avez battu aussi! Oui - votre point est juste :)



3
votes

Global :: Le qualificatif de l'espace de noms est utilisé dans AUTO généré pour empêcher la collision de type Résolution des espaces de noms imbriqués.


0 commentaires