转载

在c#的namespace内使用using语句

正如这篇讨论提到的, 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 语句 ,如果都没找到再去外层命名空间中按照同样的顺序查找。

原文  http://zp-j.github.io/2016/04/21/Put-using-inside-namespace/
正文到此结束
Loading...