正如这篇讨论提到的, Should ‘using’ statements be inside or outside the namespace ,在公司使用的 StyleCop 经常会提示,建议将 using 语句放在 namespace 内部。原本的讨论中已经讲得听清楚了,这里做个小结。
举例,在代码片段 File1.cs 中,我们在 Outer.Inner 这个命名空间内声明了一个类 Foo,其中有一个静态函数 Bar() 会用到 Math 这个全局变量。
// File1.cs using System; namespace Outer.Inner { class Foo { static void Bar() { double d = Math.PI; } } }
加入现在有第二个代码片段 File2.cs,在 Outer 这个命名空间内声明了一个类 Math。
// File2.cs namespace Outer { class Math { } }
于是,在 Foo.Bar() 中,当执行到 Math 时,系统会首先到命名空间 Outer 中去寻找 Math 的定义,其次才是去命名空间外的 System 中去寻找。由于我们已经在 Outer 中定义了 Math, Foo.Bar() 会直接调用 Outer.Math 而不是 System.Math ,而 Outer.Math 并没有成员 PI,因此 File1 会报错。所以,当我们把 File1 中的 using 语句放到命名空间内之后,程序则一切正常。
// File1b.cs namespace Outer.Inner { using System; class Foo { static void Bar() { double d = Math.PI; } } }
如果我们的 File1 是这样子,即 Foo 跟 File2 中的 Math 同在命名空间 Outer 内,这个时候 Foo.Bar() 会直接使用 Outer.Math,而不是 System.Math,不管 using 是放在命名空间内还是外。
// File1b.cs namespace Outer { using System; class Foo { static void Bar() { double d = Math.PI; } } }
这也说明了一点, 程序总总是先看自己同一命名空间中的定义,其次再看同一命名空间中的 using 语句 ,如果都没找到再去外层命名空间中按照同样的顺序查找。