Les directives 'using' doivent-elles être à l'intérieur ou à l'extérieur de l'espace de noms en C# ?

Les directives ‘using’ doivent-elles être à l’intérieur ou à l’extérieur de l’espace de noms en C# ?

Il y a en fait une différence (subtile) entre les deux. Imaginez que vous avez le code suivant dans File1.cs :

// File1.cs
using System;
namespace Outer.Inner
{
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

Maintenant imaginez que quelqu’un ajoute un autre fichier (File2.cs) au projet qui ressemble à ceci :

// File2.cs
namespace Outer
{
    class Math
    {
    }
}

Le compilateur recherche dans Outer avant de regarder les directives using en dehors de l’espace de noms, il trouve donc Outer.Math au lieu de System.Math. Malheureusement (ou peut-être heureusement ?), Outer.Math n’a pas de membre PI, donc File1 est maintenant cassé.

Cela change si vous placez le using à l’intérieur de votre déclaration d’espace de noms, comme suit :

// File1b.cs
namespace Outer.Inner
{
    using System;
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

Maintenant le compilateur recherche dans System avant de rechercher dans Outer, trouve System.Math, et tout va bien.

Certains pourraient argumenter que Math pourrait être un mauvais nom pour une classe définie par l’utilisateur, puisqu’il en existe déjà une dans System ; le point ici est simplement qu’il y a une différence, et que cela affecte la maintenabilité de votre code.

Il est également intéressant de noter ce qui se passe si Foo est dans l’espace de noms Outer, plutôt que Outer.Inner. Dans ce cas, l’ajout de Outer.Math dans File2 casse File1 quel que soit l’emplacement du using. Cela implique que le compilateur recherche l’espace de noms englobant le plus interne avant de regarder toute directive using.