返回顶部

OutOfMemory.CN技术专栏-> C#-> 在C#的namespace内使用using语句

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

正如这篇讨论提到的, Should ‘using’ statements be inside or outside the namespace ,在公司使用的 StyleCop 经常会提示,建议将 using 语句放在 namespace 内部。原本的讨论中已经讲得听清楚了,这里做个小结。

推荐阅读:
支持

0

反对

0

Zhipeng Jiang:In Pursuit of Absolute Simplicity

您可以通过下面的社交媒体联系/了解作者的更多信息:

发表评论