这两个声明有什么区别?

时间:2009-06-05 06:12:41

标签: c# coding-style

鉴于此声明:

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

namespace AProject.Helpers
{
    public static class AClass
    {

和这个声明

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

    public static class AClass
    {

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

我总是习惯于像第一个一样宣布我的课程,但最近注意到微软uses the second

7 个答案:

答案 0 :(得分:26)

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

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

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

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

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

namespace Y
{
    // Maybe more using directives
    // Code
}
// End of file

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

然而,这并不是唯一的区别 - 即使只有一个命名空间声明,它也会影响代码。subtle case which Eric Lippert points out (基本上如果你在命名空间X声明中写using Foo;,并且有一个命名空间X.Foo以及Foo,行为就会改变。这可以使用命名空间别名来解决,例如{{ 1}}如果你真的想要。)

就个人而言,我坚持:

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

答案 1 :(得分:6)

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

详情here

答案 2 :(得分:2)

第二种可能含糊不清;

最重要的一个是在这些名称空间之后清楚地表明你的意思:

  • 系统
  • System.Collections中
  • System.Collections.Generic

虽然第二个将首先查找这些名称空间:

  • AProject.Helpers.System
  • AProject.Helpers.System.Collections
  • AProject.Helpers.System.Collections.Generic

如果找到它们,请参考它们......如果没有,它们都会引用相同的命名空间。

第二个更安全的重写将是:

namespace AProject.Helpers
{
    using global::System;
    using global::System.Collections;
    using global::System.Collections.Generic;
}

答案 3 :(得分:1)

使用LINQ-to-SQL和生成的datacontext类时,会出现另一个重要差异。例如,Northwind示例数据库;最初,你得到:

  • Northwind.dbml
    • Northwind.dbml.layout
    • Northwind.designer.cs

如果您现在想要通过添加自己的Northwind.cs来扩展分部类,那么您将获得

  • Northwind.dbml
    • Northwind.dbml.layout
    • Northwind.designer.cs
    • Northwind.cs

有趣,代码生成器(MSLinqToSQLGenerator)中存在错误 - 这意味着如果using指令之外命名空间(就像它们默认情况下一样),它打破了 - 消息:

  

The custom tool 'MSLinqToSQLGenerator' failed. Unspecified error

Northwind.designer.cs文件被删除。没有更多的数据背景!

但是,如果您将using指令移到命名空间内(并重新运行自定义工具 - 右键单击​​解决方案资源管理器中),它就能正常工作。

所以:这不是语言细节 - 它只是代码生成器中的一个错误;但是“正常工作”与生成的代码被删除之间存在很大差异......

请注意,您也可以通过调用不同的文件来解决此问题,例如NorthwindExtras.cs

怪异。

答案 4 :(得分:0)

我想可能有理由从纯粹主义的角度使用第二种替代方案,因为它更清楚地表明using指令的范围是什么。

答案 5 :(得分:0)

在第一个示例中,using声明对整个文件是“全局的”。在第二个示例中,using语句仅适用于命名空间块中包含的代码。

我认为唯一真正重要的是,如果文件中有多个命名空间,并希望使用声明限制哪个命名空间可以访问每个命名空间。

答案 6 :(得分:0)

对于Arjan指出的过程,在命名空间内声明使用是不好的做法。它们可以被另一个名称空间隐式覆盖。