一尘不染

'using' 指令应该在命名空间内部还是外部?

c#

我一直在通过一些 C# 代码运行StyleCop,它不断报告我的using指令应该在命名空间内。

using将指令放在命名空间内部而不是外部是否有技术原因?


阅读 144

收藏
2022-02-09

共1个答案

一尘不染

两者之间实际上存在(细微的)差异。假设您在 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那些指令之前进行搜索,因此它会找到而不是. 不幸的是(或者幸运的是?),没有成员,所以 File1 现在坏了。using``Outer.Math``System.Math``Outer.Math``PI

如果您将using命名空间声明放在内部,则会发生这种情况,如下所示:

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

现在编译器在 search , findsSystem之前搜索,一切都很好。Outer``System.Math

有些人会争辩说,Math这对于用户定义的类来说可能是一个坏名字,因为 ; 中已经有一个了System。这里的重点只是存在差异,它会影响代码的可维护性。

Foo注意到如果在命名空间中会发生什么也很有趣Outer,而不是Outer.Inner. 在这种情况下,添加Outer.MathFile2 会破坏 File1 ,无论去哪里using。这意味着编译器在查看任何using指令之前会搜索最里面的封闭命名空间。

2022-02-09