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 à quoi cela sert. Quelqu'un peut-il l'expliquer ?
Réponses
Trop de publicités?Global fait référence à l'espace de noms global, il peut être utilisé pour résoudre les problèmes de redéfinition des types. Par exemple :
class foo
{
class System
{
}
}
Si vous deviez utiliser System où il serait localisé dans la classe foo, vous pourriez utiliser :
global::System.Console.WriteLine("foobar");
pour accéder à l'espace de nom 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
}
}
}
Il s'agit d'un préfixe parfois nécessaire pour indiquer l'espace de nom Root.
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 une classe appelée System
mais vous avez ensuite voulu utiliser System.String
. Vous pouvez utiliser global::System.String
à différencier.
Je crois que le ::
vient du C++ où il est utilisé comme séparateur d'espace de nom.
En pratique, je ne l'ai jamais utilisé, si ce n'est pour générer du code. Notez que vous pouvez également contourner certains conflits en utilisant des alias. Par exemple using String = System.String;
El global
Le mot-clé contextuel, lorsqu'il précède l'opérateur : :, fait référence à l'espace de nom global, qui est l'espace de nom par défaut de tout programme C# et qui est autrement sans nom.
El global::
indique au compilateur de commencer à chercher 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. Ainsi, si vous avez un espace de noms juste en dessous de votre espace de noms actuel qui est le même que l'espace de noms de niveau supérieur auquel le code essaie d'accéder, il n'y aura pas de conflit.
Par exemple, disons que vous avez un espace de noms A, un espace de noms B et un espace de noms B.A. Si j'écris du code dans l'espace de noms B.A qui doit faire référence à 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 cherchera classname dans B.A. Avec global: :, je peux lui dire de chercher classname dans global::A.classname et il trouvera classname au bon endroit.
El global::
L'espace de noms et son identifiant ne sont pas ce que la plupart des gens pensent. Il ne s'agit pas d'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 de votre application et qui est rattaché à un Root global.
Si vous créez une classe ou un type en dehors de vos espaces de noms de premier niveau, vous devez supposer qu'il fait automatiquement partie de l'espace de noms GLOBAL et qu'il est accessible par la fonction global::
dans tous les fichiers de votre application ou assemblage. En fait, ces noms se trouvent le plus souvent dans la portée LOCAL compilée de ce fichier uniquement, mais ils sont accessibles via la balise global::
identifiant.
Si vous créez une classe ou un espace de nom de premier niveau dans un fichier aspx.cs, il est accessible par le biais de l'option global::
de l'espace de nom global dans ce fichier. Mais si vous tapez global::
dans un autre fichier, cette classe et cet espace de noms n'existent pas dans l'espace de noms global. En revanche, si vous créez cette même classe ou ce même espace de noms dans un fichier class.cs, ces éléments sont disponibles pour tous les autres fichiers via le fichier global::
et dans l'espace de nom global ainsi que dans l'espace local du fichier. Pourquoi ?
Il s'avère que global::
est en fait une référence aux noms LOCAUX de premier niveau dans la portée du fichier ainsi qu'aux noms GLOBAUX partagés par l'assemblage (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 confus et pas cohérent, puisque global::
implique l'accès aux espaces de noms de premier niveau et aux types créés dans l'application qui sont liés à l'espace de noms global. Certains, comme "System", sont liés à l'espace de noms global par défaut dans tous les fichiers, mais les types personnalisés peuvent l'être ou non en fonction de la portée de ce fichier. C'est pourquoi l'identificateur global joue un rôle secondaire en résolvant les références aux noms de l'étendue de votre racine locale.
Vous pouvez tester cela en créant des espaces de noms et des classes de premier niveau dans certaines parties de votre application, puis en utilisant la commande 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. Les éléments auxquels il ne peut pas accéder sont clairement assignés à une "portée globale locale" dans ce fichier uniquement, ce qui signifie qu'il n'est pas possible d'y accéder. global::
vous aide à accéder aux conflits de dénomination.