<p>Il y a en fait une différence (subtile) entre les deux. Imaginez que vous avez le code suivant dans File1.cs :</p>
<pre><code class="lang-auto">// File1.cs
using System;
namespace Outer.Inner
{
class Foo
{
static void Bar()
{
double d = Math.PI;
}
}
}
</code></pre>
<p>Maintenant imaginez que quelqu’un ajoute un autre fichier (File2.cs) au projet qui ressemble à ceci :</p>
<pre><code class="lang-auto">// File2.cs
namespace Outer
{
class Math
{
}
}
</code></pre>
<p>Le compilateur recherche dans <code>Outer</code> avant de regarder les directives <code>using</code> en dehors de l’espace de noms, il trouve donc <code>Outer.Math</code> au lieu de <code>System.Math</code>. Malheureusement (ou peut-être heureusement ?), <code>Outer.Math</code> n’a pas de membre <code>PI</code>, donc File1 est maintenant cassé.</p>
<p>Cela change si vous placez le <code>using</code> à l’intérieur de votre déclaration d’espace de noms, comme suit :</p>
<pre><code class="lang-auto">// File1b.cs
namespace Outer.Inner
{
using System;
class Foo
{
static void Bar()
{
double d = Math.PI;
}
}
}
</code></pre>
<p>Maintenant le compilateur recherche dans <code>System</code> avant de rechercher dans <code>Outer</code>, trouve <code>System.Math</code>, et tout va bien.</p>
<p>Certains pourraient argumenter que <code>Math</code> pourrait être un mauvais nom pour une classe définie par l’utilisateur, puisqu’il en existe déjà une dans <code>System</code> ; le point ici est simplement qu’il <em>y a</em> une différence, et que cela affecte la maintenabilité de votre code.</p>
<p>Il est également intéressant de noter ce qui se passe si <code>Foo</code> est dans l’espace de noms <code>Outer</code>, plutôt que <code>Outer.Inner</code>. Dans ce cas, l’ajout de <code>Outer.Math</code> dans File2 casse File1 quel que soit l’emplacement du <code>using</code>. Cela implique que le compilateur recherche l’espace de noms englobant le plus interne avant de regarder toute directive <code>using</code>.</p>