C# - using语句的位置

Nat*_*lor 10 c# scope using-statement

我注意到很多东西来回的一件事是将使用语句放在C#代码文件中 - 无论是在最外层还是在命名空间内.我理解using语句的位置会影响该文件中引用的范围,但我不明白的是,在大多数情况下,有人会想要在其命名空间中使用它们的using语句.

几乎所有情况下,单个文件中只存在一个名称空间声明,因此使用using语句的范围似乎/(是?)无效.如果一个人在同一个文件中放置了多个类型和多个命名空间,那么使用语句进行范围化就很有意义了,但即使在具有一个命名空间的文件中,我仍然会看到很多这种情况.为什么?

using System;

namespace MyNamespace
{
    using System.Text;

    public class MyClass {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在整个项目中,看似不必要的一个例子是ASP.NET MVC源代码.

Jim*_*m W 13

将"using"放在文件的顶部是Visual Studio的默认方式.但是,建议的方法是在命名空间中放置"using"语句.甚至MS的stylecop也抓住了这个,并说VS的默认方式是错误的.

这两种技术都很好.

StyleCop规则说: 在单个文件中放置多个名称空间元素通常是一个坏主意,但是如果这样做,最好将所有使用指令放在每个名称空间元素中,而不是全局放在顶部.文件.这将严格限定命名空间的范围,并且还有助于避免上述类型的行为.

重要的是要注意,当使用位于命名空间之外的using指令编​​写代码时,在命名空间中移动这些指令时应小心,以确保这不会改变代码的语义.如上所述,在namespace元素中放置using-alias指令允许编译器以指令放置在命名空间之外时不会发生的方式在冲突类型之间进行选择.

以下是一些进一步审查的链接:

  • 对不起,但这是完全错误的.首先,`using`指令不引用_assemblies_ - 它们导入_namespaces_!例如,程序集`mscorlib.dll`,`System.dll`和`System.Core.dll`中存在`namespace System`.此外,C#`using`指令对输出MSIL完全没有影响,因为MSIL总是具有完整的所有类型名称,并且在MSIL级别上根本没有"命名空间"的概念.在Scott的帖子中观察到的效果很可能与_VS debugger_在具有源代码时处理程序集的加载有关. (6认同)
  • 啊,实际上,现在我仔细阅读了斯科特的博客文章,他实际上已经_debunking_索赔了.具体来说,他说:"如果我使用INSIDE命名空间做同样的事情我得到相同的结果......我99.99%肯定在这一点上使用指令不能改变你的程序集加载行为,我想我是是可疑的." (4认同)