c# - Should 'using' directives be inside or outside the namespace?
itemprop="text">
I have been running href="http://en.wikipedia.org/wiki/StyleCop" rel="noreferrer">StyleCop over
some C# code, and it keeps reporting that my using
directives
should be inside the namespace.
Is
there a technical reason for putting the using
directives
inside instead of outside the namespace?
class="post-text" itemprop="text">
There is
actually a (subtle) difference between the two. Imagine you have the following code in
File1.cs:
//
File1.cs
using System;
namespace Outer.Inner
{
class Foo
{
static void Bar()
{
double d = Math.PI;
}
}
}
Now
imagine that someone adds another file (File2.cs) to the project that looks like
this:
//
File2.cs
namespace Outer
{
class Math
{
}
}
The
compiler searches Outer
before looking at those
using
directives outside the namespace, so it finds
Outer.Math
instead of System.Math
.
Unfortunately (or perhaps fortunately?), Outer.Math
has no
PI
member, so File1 is now
broken.
This changes if you put the
using
inside your namespace declaration, as
follows:
//
File1b.cs
namespace Outer.Inner
{
using
System;
class Foo
{
static void
Bar()
{
double d = Math.PI;
}
}
}
Now the
compiler searches System
before searching
Outer
, finds System.Math
, and all is
well.
Some would argue that
Math
might be a bad name for a user-defined class, since
there's already one in System
; the point here is just that
there is a difference, and it affects the maintainability of your
code.
It's also interesting to note what happens
if Foo
is in namespace Outer
, rather
than Outer.Inner
. In that case, adding
Outer.Math
in File2 breaks File1 regardless of where the
using
goes. This implies that the compiler searches the
innermost enclosing namespace before it looks at any using
directive.
No comments:
Post a Comment