我很想知道为什么在C#,though in C++ it is not中可以接受“using namespace”指令。我知道C ++和C#是不同的,但我的猜测是C ++和C#几乎来自同一个家族,并且应该使用相同的想法来进行命名空间解析。 C ++和C#都有一个别名关键字来解决命名空间冲突。
任何人都可以指出我,我不是在C#中的行之间阅读,这使得使用“using namespace”指令是可以接受的,并避免了C ++无法解决的问题。
答案 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)
除非您是语言纯粹主义者,否则可以节省时间并简化编码。除非你正在处理复杂的命名空间系统,否则它是完全可以接受的。