2009-08-27 36 views
10

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

几乎所有的情况下只有一个命名空间声明曾经存在于一个单独的文件中,所以对使用语句的范围看起来似乎是/(是?)无用的。如果一个人在同一个文件中放置多个类型和多个名称空间,那么使用语句作用域是非常合理的,但即使在具有一个名称空间的文件中,我仍然可以看到很多情况。为什么?

using System; 

namespace MyNamespace 
{ 
    using System.Text; 

    public class MyClass { 
     // ... 
    } 
} 

这样的例子正在做整个项目看似不必要是ASP.NET MVC source

+1

这真的被打死了。这篇文章的“为什么”包含在这篇文章中:http://stackoverflow.com/questions/125319/should-usings-be-inside-or-outside-the-namespace – womp 2009-08-27 18:22:23

+0

你的SO-Search-Fu比我大自己......当我搜索到类似内容时,我无法找到该帖子。 :) – 2009-08-27 18:23:31

+0

只是为了澄清,这个问题实际上是关于[使用指令](http://msdn.microsoft.com/en-us/library/sf0df423(v = vs.110).aspx),而不是[使用语句(http://msdn.microsoft.com/en-us/library/yh598w02(v = vs.110)的.aspx)。 – mwardm 2013-12-09 12:39:30

回答

12

将“使用”放在文件的顶部是Visual Studio的默认方式。但是,推荐的方法是在命名空间中放置“使用”语句。即使MS的stylecop捕捉到这一点,并说VS的默认方式是错误的。

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

了StyleCop规则说: 放置多个命名空间的元素 一个单独的文件中一般是 坏主意,但如果当这 完成,这是一个好主意,将所有 使用内指令每个 名称空间元素,而不是全局位于文件顶部的 。这个 将严格限制命名空间,并且 也将有助于避免上述行为的种类。

需要注意的是,当代码 已写入使用放置在命名空间之外的指令 ,关心 应在命名空间中移动这些 指令时,应考虑到 保证,这是不改变 是非常重要的代码的语义。如上所述 ,将使用别名指令 的名字空间元素内允许 编译器中,当指令是 放置命名空间的外侧,将 不会发生方式 冲突的类型之间进行选择。

下面是进一步审查一些链接:

+6

对不起,这显然是错误的。对于初学者来说,'using'指令不会引用_assemblies_ - 他们会导入_namespaces_!例如'namespace System'存在于程序集mscorlib.dll,System.dll和System.Core.dll中。此外,C#'using'指令对输出MSIL完全没有影响,因为MSIL总是拥有所有的类型名称,并且在MSIL级别上根本没有“命名空间”的概念。在Scott的帖子中观察到的效果很可能与_VS debugger_在处理源代码时处理装配加载有关。 – 2009-08-27 18:25:23

+4

啊,实际上,现在我仔细阅读斯科特的博客文章,他实际上是_debunking_的说法。具体来说,他说:“如果我在使用INSIDE命名空间时做同样的事情,我会得到相同的结果......我99.99%肯定在这一点上,使用指令不能改变你的程序集加载行为,我想我是有权怀疑。“ – 2009-08-27 18:27:01

+1

哎呀,坏的报价..更新了它。 – 2009-08-27 18:32:24

0

编辑,我的头挂在耻辱

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

非常不同的,模糊的词语......你有我困惑:-)

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

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


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

+0

这不是他所指的。 – womp 2009-08-27 18:20:35

+4

“每个名称空间只有一个类” - 真的吗? – grenade 2009-08-27 18:22:06

+0

当我读到它的时候,我也笑了起来。 :D – 2009-08-27 18:24:03

3

我从来没有见过/听说过这种做法,直到我开始使用g StyleCop,并将被标记为rule SA1200,现在我只是禁用它。奇怪的是Visual Studio作为新项目的一部分创建的.cs文件通过将命令空间中的using指令放置在文件的开头,违反了此规则。