鉴于此声明:
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。
答案 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)
第二种可能含糊不清;
最重要的一个是在这些名称空间之后清楚地表明你的意思:
虽然第二个将首先查找这些名称空间:
如果找到它们,请参考它们......如果没有,它们都会引用相同的命名空间。
第二个更安全的重写将是:
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指出的过程,在命名空间内声明使用是不好的做法。它们可以被另一个名称空间隐式覆盖。