为什么;使用名称空间";指令是C#中公认的编码实践?

为什么;使用名称空间";指令是C#中公认的编码实践?,c#,c++,C#,C++,我只是想知道为什么“使用名称空间”指令在C#中是可以接受的。我知道C++和C是不同的,但是我的猜测是C++和C几乎来自同一个家庭,并且应该使用相同的名字空间解析思想。C++和C语言都有别名关键字来实现命名空间冲突。 我可以指出,我在C++中没有读到哪些行,它可以接受使用“命名空间”指令,避免C++无法解决的问题。Intellisense、Visual Studio的快速类查找(F1键)和重构选项提供了所需的引用查找功能 也有,C类在一个类中有每种方法——没有命名空间级函数。C++中的< P>,如

我只是想知道为什么“使用名称空间”指令在C#中是可以接受的。我知道C++和C是不同的,但是我的猜测是C++和C几乎来自同一个家庭,并且应该使用相同的名字空间解析思想。C++和C语言都有别名关键字来实现命名空间冲突。

我可以指出,我在C++中没有读到哪些行,它可以接受使用“命名空间”指令,避免C++无法解决的问题。Intellisense、Visual Studio的快速类查找(F1键)和重构选项提供了所需的引用查找功能


也有,C类在一个类中有每种方法——没有命名空间级函数。C++中的

< P>,如果在头中使用命名空间< /代码>编写<代码>,那么对于包含该头的任何人都将生效。这使得它在标题中几乎不可用。在这一点上,您也可以在.cpp文件中避免使用它(在全局范围内),如果只是为了一致性,并使在.h和.cpp之间移动实现更容易

(请注意,使用名称空间的局部作用域
(即在函数中)通常被认为是很好的;只是它们对详细性没有多大帮助)

在C#中,没有什么比
#include
更好的了,而且
使用
指令的范围永远不会超出单个.cs文件。所以在任何地方使用都非常安全

另一个原因是标准库的设计。在C++中,你只拥有<代码> STD< /Cord>(好,现在也有几个在它下面,但是它们很少被使用)。在C#中,有一些gem,比如
System.Collections.Generic
,对于一些非常常用的东西来说,这些gem非常冗长。在C++中避免使用<<代码> >代码>比C++中的< < > >要痛苦得多。
P> >总结,C++和C++在代码模块化(我将把头、模块、命名空间都分配给该组)方面有一些共同的设计,它们的设计是非常不同的。

< P>一般来说,C和C++的区别是如何处理和指定编译单元。 C++使用头文件发布类声明,并且需要一个编译单元来实现(定义)这个类。在头文件中使用命名空间< /COD>语句的<>代码强烈阻碍C++的实践,因为这很容易导致从某些客户端代码中包含命名空间冲突和模糊。在类声明中,您应该显式地声明您希望从其他名称空间(包括
std
)获得什么


C#有单个编译单元,可以稍微简化使用命名空间语句的
。尽管如此,如果您想避免繁琐的键入,我还是更喜欢为导入的名称空间添加别名。在.cs文件中使用
语句放置
,也可能会导致定义不明确。

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

虽然我完全同意其他人的观点,即不应在标题中使用名称空间,但我认为在cpp文件中禁止它们是短视的。如果您试图“很好地”坚持将声明组织到名称空间中,但随后又完全禁止使用“使用名称空间”,那么编码人员阻力最小的路径就是名称空间使用不足

例如,在Pavel Minaev的上述文章中,他正确地指出了一个普通的C++命名空间、“STD”和一个C’s命名空间“Stase.Cuff.Gu泛泛型”之间的命名空间差异。如果你停下来想一想<强>为什么是这样/强>,一个明确的答案是IMO是C++文化在使用命名空间时不喜欢,而C语言则不喜欢,所以在C语言中,你接受更多的冗长的名字空间,因为它们不是天生就痛苦的。我认为C语言中的命名空间组织比C++大得多,这主要是因为这种文化差异,更好的类组织和一般可读性不是微不足道的事情。 换一种说法,考虑一下如果应用程序要求人们键入完全限定的路径来加载文件,人们的文件组织习惯会发生什么变化。他们更可能只是把所有东西都塞进根文件夹以避免打字,这不是提升组织质量的好方法


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

我想说,我更喜欢使用名称空间别名(而不是
System
或类似的基本名称空间)来避免名称空间冲突,而不是简单地在C#中放置
using namespace
语句!它们可能有100%种不同,但是问题仍然有效,为什么在C语言中,命名空间的方法/类暴露是可以的,但是不是C++中的?@ DayielFiguula:结果我完全误解了C中使用的是什么,它们实际上非常相似。类似的:也考虑类似的java,使用代码> >导入< /Cl>,甚至<代码>静态导入< /代码>。加上1,关于名称空间级功能的注释。我认为C++中使用“命名空间”的原因很大,这是正确的。C++中包含一个报头是一个文本包含,而不是一个符号包含。