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