这两个声明有什么区别?

eKe*_*ek0 9 c# coding-style

鉴于此声明:

using System;
using System.Collections;
using System.Collections.Generic;

namespace AProject.Helpers
{
    public static class AClass
    {
Run Code Online (Sandbox Code Playgroud)

和这个宣言

namespace AProject.Helpers
{
    using System;
    using System.Collections;
    using System.Collections.Generic;

    public static class AClass
    {
Run Code Online (Sandbox Code Playgroud)

他们之间有什么区别吗?或者只是编码风格的差异?

我总是习惯于像第一个一样宣布我的课程,但最近注意到微软使用了第二个.

Jon*_*eet 26

在后一版本中,using指令仅适用于名称空间声明.

在大多数情况下,您只有一个名称空间声明:

// Using directives
...
namespace X
{
    // Maybe more using directives
    // Code
}
// End of file
Run Code Online (Sandbox Code Playgroud)

主要区别在于,如果同一文件中有多个名称空间:

// Using directives
...
namespace X
{
    // Maybe more using directives
    // Code
}

namespace Y
{
    // Maybe more using directives
    // Code
}
// End of file
Run Code Online (Sandbox Code Playgroud)

在这种情况下,名称空间X声明中的using指令不会影响名称空间Y声明中的代码,反之亦然.

然而,这并不是唯一的区别 - 有一个微妙的案例,Eric Lippert指出它可以影响代码,即使只有一个命名空间声明.(基本上,如果你写using Foo;的命名空间X声明中,并有一个命名空间X.Foo以及Foo,行为发生变化.这可以通过使用一个命名空间的别名,如加以补救using global::Foo;,如果你真正想要的.)

我个人坚持:

  • 每个文件一个名称空间声明(通常每个文件一个顶级类型)
  • 使用名称空间声明之外的指令


ane*_*son 6

它使得该命名空间的using指令本地化,实际上应该没有区别,因为你(希望)没有在单个源文件中声明多个命名空间中的多个类型.

细节在这里.