【问题标题】:C# - Location of using statementsC# - using 语句的位置
【发布时间】:2010-11-23 11:47:21
【问题描述】:

我注意到很多来回的事情是 using 语句应该放在 C# 代码文件中的位置 - 无论是在最外层范围内还是在命名空间内。我知道 using 语句的位置会影响该文件中引用的范围,但我不明白为什么在大多数情况下,有人会希望他们的 using 语句在他们的命名空间中。

几乎所有情况中,单个文件中只存在一个命名空间声明,因此限定 using 语句的范围似乎/(是?)没用。如果在同一个文件中放置多种类型和多个命名空间,那么使用语句的作用域是非常有意义的,但我仍然看到很多这样的案例,即使在具有一个命名空间的文件中也是如此。为什么?

using System;

namespace MyNamespace
{
    using System.Text;

    public class MyClass {
        // ...
    }
}

ASP.NET MVC source 是一个在整个项目中看似不必要地执行此操作的示例。

【问题讨论】:

标签: c# scope using-statement


【解决方案1】:

已编辑,我羞愧地低着头

啊!您引用的 using 语句用于导入命名空间,而不是包装 IDisposable 对象!

非常不同、模棱两可的术语...你让我感到困惑:-)

我个人喜欢它们在文件顶部的命名空间之外;但这可能是因为我在 C# 和 VB.NET 之间切换。

我喜欢将我的项目组织成每个类 1 个文件,没有内部(嵌套)类,每个命名空间只有一个类(每个文件)。在这种情况下,using 语句的位置无论在命名空间内部还是外部都无关紧要。


iDesignC# coding standard 是一个可靠的标准,可以遵循(或从中派生出自己的标准)。它建议将using 语句保留在命名空间之外,作为项目#14。但这完全取决于您的公司/项目的约定

【讨论】:

  • 他指的不是这个。
  • “每个命名空间只有一个类” - 真的吗?
  • @grenade:是的,那是一个错字......预期的意思是多余的,但应该是“每个文件每个命名空间一个类”。哎呀!
【解决方案2】:

将“使用”放在文件顶部是 Visual Studio 的默认方式。但是,推荐的方法是将“使用”语句放在命名空间内。甚至 MS 的 stylecop 也发现了这一点,并说 VS 的默认方式是错误的。

这两种技术都可以正常工作。

StyleCop 规则说: 放置多个命名空间元素 在单个文件中通常是 坏主意,但是如果以及何时 完成后,最好将所有 在每个中使用指令 命名空间元素,而不是 全局位于文件顶部。这 将严格限定命名空间,并且 也将有助于避免那种 上述行为。

需要注意的是,当代码 已使用 using 指令编写 放在命名空间之外,小心 移动这些时应采取 命名空间中的指令,以 确保这不会改变 代码的语义。如解释 上面,放置 using-alias 指令 在命名空间元素内允许 可供选择的编译器 冲突类型的方式,将 当指令是时不会发生 放置在命名空间之外。

这里有一些链接供进一步审查:

【讨论】:

  • 抱歉,这是完全错误的。对于初学者,using 指令不引用 assemblies - 它们导入 namespaces!例如,namespace System 存在于程序集 mscorlib.dllSystem.dllSystem.Core.dll 中。此外,C#using 指令对输出 MSIL 绝对没有影响,因为 MSIL 始终具有完整的所有类型名称,并且在 MSIL 级别上根本没有“命名空间”的概念。在 Scott 的帖子中观察到的效果很可能与 VS 调试器 在拥有源代码时如何处理程序集的加载有关。
  • 啊,事实上,现在我仔细阅读了 Scott 的博文,他实际上是在 揭穿 的说法。具体来说,他说:“如果我对命名空间内的 usings 做同样的事情,我会得到相同的结果......我有 99.99% 的把握在这一点上 using 指令不能改变你的程序集加载行为,我想我是怀疑的权利。”
  • 糟糕,引用错误.. 已更新。
  • @Jim W 你错误地引用了 Scott。他在简单地证明他们错了之前引用了其他人。
  • 在命名空间元素中放置 using-alias 指令允许编译器以在指令放置在命名空间之外时不会发生的方式在冲突类型之间进行选择。 thewayithink.co.uk/stylecop/sa1200.htm
【解决方案3】:

在我开始使用 StyleCop 之前,我什至从未见过/听说过这种做法,并且会被 rule SA1200 标记,我现在只是禁用它。奇怪的是,Visual Studio 作为新项目的一部分创建的 .cs 文件违反了此规则,因为它将 using 指令放在文件的最开头,位于命名空间之外。

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 2013-05-07
    • 1970-01-01
    • 2011-09-17
    • 2011-03-05
    • 2011-09-26
    • 2019-02-05
    • 1970-01-01
    • 2013-05-30
    相关资源
    最近更新 更多