为什么“使用命名空间”指令是C#中接受的编码实践?

时间:2013-07-23 22:28:51

标签: c# c++

我很想知道为什么在C#,though in C++ it is not中可以接受“using namespace”指令。我知道C ++和C#是不同的,但我的猜测是C ++和C#几乎来自同一个家族,并且应该使用相同的想法来进行命名空间解析。 C ++和C#都有一个别名关键字来解决命名空间冲突。

任何人都可以指出我,我不是在C#中的行之间阅读,这使得使用“using namespace”指令是可以接受的,并避免了C ++无法解决的问题。

5 个答案:

答案 0 :(得分:27)

在C ++中,如果您在标题中编写using namespace,那么它对包含该标题的任何人都有效。这使它在标题中几乎无法使用。此时,您也可以在.cpp文件中避免它(在全局范围内),如果只是为了保持一致性,并使.h和.cpp之间的移动实现更容易。

(请注意,本地范围内的using namespace - 即在一个函数中 - 通常被认为是好的;只是它们对冗长度没有多大帮助。

在C#中,没有类似#include的内容,using指令的范围永远不会超出单个.cs文件。因此,在任何地方使用都非常安全。

另一个原因是标准库的设计。在C ++中,你只有std(好吧,现在还有一些,但它们很少使用)。在C#中,你拥有诸如System.Collections.Generic之类的宝石,这对于非常常用的东西来说非常冗长。避免使用C#中的using比使用C ++时更加痛苦。

总结一下,虽然C#和C ++确实共享一些常见的设计,但在代码模块化方面(我将头部,模块,名称空间全部分配给该组),它们的设计却截然不同。

答案 1 :(得分:5)

对我而言,它归结为支持工具。 Intellisense,快速类查找(F1键)和Visual Studio的重构选项提供了所需的参考查找功能。

此外,C#包含一个类中的每个方法 - 没有命名空间级别的函数。

答案 2 :(得分:3)

通常,C#和C ++的区别在于如何处理和指定编译单元。

C ++使用头文件发布类声明,并且需要一个实现(定义)此类的编译单元。强烈建议C ++使用头文件中的using namespace <xxx>语句,因为当从某些客户端代码中包含时,这很容易导致命名空间冲突和歧义。在类声明中,您应该从其他命名空间(包括std)明确说明您想要的内容。

C#具有单个编译单元,可以轻松使用using namespace <xxx>语句。不过,如果你想避免繁琐的输入,我更喜欢别名导入的命名空间。将using语句放在.cs文件中也可能导致定义不明确。

答案 3 :(得分:1)

虽然我完全同意其他人不应该在标题中使用命名空间,但我认为在cpp文件中禁止它们是短视的。如果你试图坚持将声明组织成'名称空间',但是然后完全禁止使用'using namespace',那么编码器阻力最小的路径就变成了名称空间的使用不足。

例如,在Pavel Minaev的上述文章中,他理所当然地指出了公共C ++名称空间“std”和C#名称空间“System.Collections.Generic”之间的名称空间差异。如果你停下来想到为什么他们是这样的,一个明确的答案IMO是C ++文化对使用命名空间不满意,而C#没有,所以在C#中你接受更详细的命名空间,因为它们本身并不存在使用起来很痛苦。我认为C#中的命名空间组织比C ++好得多,主要是因为这种文化差异,更好的类组织和一般可读性并不是一件容易的事。

换句话说,如果应用程序要求他们键入完全限定的路径来加载文件,请考虑人们的文件组织习惯会发生什么。他们更可能只是将所有东西都推到根文件夹中以避免打字,而不是促进高质量组织的好方法。

虽然肯定不像C#的using指令那样干净,但在cpp文件中使用命名空间是一个全面的胜利。

答案 4 :(得分:0)

除非您是语言纯粹主义者,否则可以节省时间并简化编码。除非你正在处理复杂的命名空间系统,否则它是完全可以接受的。