Friday 22 December 2017

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">
class="normal">Answer



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

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...