问题

我已经在某些C#代码上运行 StyleCop ,并且一直报告我的使用语句应该在命名空间内.

使用语句放在命名空间之外是否有技术原因?



解决方法

这两者之间实际上有一个(微妙的)差别.假设你在File1.cs中有以下代码:

// File1.cs
using System;
namespace Outer.Inner
{
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

现在假设有人向项目添加了另一个文件(File2.cs),如下所示:

// File2.cs
namespace Outer
{
    class Math
    {
    }
}

编译器搜索 Outer ,然后在命名空间外使用语句查看,所以它会找到 Outer.Math ,而不是 System .Math .不幸的是(或许幸运的是) Outer.Math 没有 PI 成员,

如果您在命名空间声明中使用使用,则会发生以下变化:

// File1b.cs
namespace Outer.Inner
{
    using System;
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

现在编译器在搜索 Outer 之前搜索 System ,找到 System.Math ,一切正常.

有人会认为 Math 可能是用户定义类的错误名称,因为 System 中已经有一个.这里的一点就是差异,它会影响代码的可维护性.

还有趣的是,如果 Foo 在命名空间外部而不是 Outer.Inner 中,会发生什么.在这种情况下,在File2中添加 Outer.Math 会破坏File1,而不管如何使用.这意味着编译器在使用语句查找任何之前搜索最内层的命名空间.




相关问题推荐