En C #, je vois global::utilisé assez souvent dans le code généré automatiquement. Ce n'est pas quelque chose que j'ai jamais utilisé moi-même, donc je ne sais pas quel est le but. Quelqu'un peut-il expliquer cela?
En C #, je vois global::utilisé assez souvent dans le code généré automatiquement. Ce n'est pas quelque chose que j'ai jamais utilisé moi-même, donc je ne sais pas quel est le but. Quelqu'un peut-il expliquer cela?
Réponses:
global fait référence à l'espace de noms global, il peut être utilisé pour résoudre les problèmes par lesquels vous pouvez redéfinir les types. Par exemple:
class foo
{
class System
{
}
}
Si vous deviez utiliser System là où il aurait une portée locale dans la classe foo, vous pourriez utiliser:
global::System.Console.WriteLine("foobar");
pour accéder à l'espace de noms global.
Exemple
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
}
}
}
C'est un préfixe parfois nécessaire indiquant l'espace de noms racine.
Il est souvent ajouté au code généré pour éviter les conflits de noms avec le code utilisateur.
Par exemple, imaginez que vous ayez appelé une classe System, mais que vous vouliez ensuite l'utiliser System.String. Vous pourriez utiliser global::System.Stringpour différencier.
Je crois que le ::vient de C ++ où il est utilisé comme séparateur d'espace de noms.
En pratique, je ne l'ai jamais utilisé, sauf pour générer du code. Notez que vous pouvez également contourner certains conflits en utilisant des alias. Par exempleusing String = System.String;
Le globalmot clé contextual, lorsqu'il précède l'opérateur ::, fait référence à l'espace de noms global, qui est l'espace de noms par défaut pour tout programme C # et qui est autrement sans nom.
Le global::spécificateur indique au compilateur de commencer à rechercher l'espace de noms ou la classe à partir de la racine. Vous le verrez dans le code généré par le système afin que le code fonctionne toujours. De cette façon, si vous avez un espace de noms juste sous votre espace de noms actuel qui est le même que l'espace de noms de niveau supérieur auquel le code tente d'accéder, il n'y aura pas de conflit.
Par exemple, disons que vous avez un espace de noms A et un espace de noms B et un espace de noms BA si j'écris du code dans l'espace de noms BA qui a besoin de référencer une classe dans l'espace de noms A, sans global :: je n'ai aucun moyen d'y accéder. Si je fais référence à A.classname, le compilateur recherchera classname dans BA Avec global :: je peux lui dire de chercher classname dans global :: A.classname et il trouvera classname à l'emplacement approprié.
L' global::espace de noms et son identifiant ne sont pas ce que la plupart des gens pensent. Ce n'est pas un identifiant universel de tout ce qui est créé dans une application qui se trouve en dehors de l'un des espaces de noms définis par votre application et qui est attaché à une racine globale.
Si vous créez une classe ou un type en dehors de vos espaces de noms de niveau supérieur, vous supposeriez qu'il fait automatiquement partie de l'espace de noms GLOBAL et qu'il est accessible par l' global::identificateur dans tous les fichiers de votre application ou assembly. En fait, ces noms sont plus souvent dans la portée LOCAL compilée de ce fichier uniquement, mais sont accessibles via l' global::identifiant.
Si vous créez une classe ou un espace de noms de niveau supérieur dans un fichier aspx.cs, il est accessible via à global::partir de l'espace de noms global de ce fichier. Mais si vous saisissez global::un autre fichier, cette classe et cet espace de noms n'existent pas dans l'espace de noms global. Cependant, si vous créez cette même classe ou cet espace de noms dans un fichier class.cs, ces éléments sont disponibles pour tous les autres fichiers via global::et dans l'espace de noms global ainsi que dans la portée locale de ces fichiers. Pourquoi?
Il s'avère que global::c'est vraiment une référence aux noms LOCAL de niveau supérieur sous la portée du fichier ainsi qu'aux noms GLOBAL partagés par l'assembly (comme ce qui pourrait être compilé dans vos fichiers de classe App_Code dans un projet ASP.NET typique).
J'ai trouvé cela très déroutant et non cohérent, car cela global::implique l'accès aux espaces de noms de haut niveau et aux types créés dans l'application qui sont liés à l'espace de noms global. Certains comme "System" sont liés par défaut à l'espace de noms global dans tous les fichiers, mais ceux personnalisés peuvent dépendre ou non de la portée de ce fichier. C'est pourquoi l'identificateur global a également un rôle secondaire de résolution des références à vos noms d'étendue racine locale.
Vous pouvez tester cela en créant des espaces de noms et des classes de niveau supérieur dans certaines parties de votre application, puis en utilisant global::pour voir ceux auxquels il peut accéder dans l'espace de noms global à partir de différentes parties de votre application et ceux auxquels il ne peut pas accéder. Ceux auxquels il ne peut pas accéder sont clairement assignés à une "portée globale locale" dans ce fichier uniquement, ce qui global::vous aide à accéder aux conflits de noms.