为什么 C# 中接受"using namespace"指令编码实践?

  • 本文关键字:指令 namespace 编码 using c# c++
  • 更新时间 :
  • 英文 :


我只是想知道为什么"使用命名空间"指令在C#中是可以接受的,而在C++中则不然。我知道C++和C#是不同的,但我猜C++和C#几乎来自同一个家族,应该在命名空间解析方面使用相同的思想。C++和C#都有一个别名关键字来避免名称空间冲突。

有人能告诉我,我在C#中的字里行间没有读到什么,这使得使用"using namespace"指令是可以接受的,并避免了C++不能解决的问题。

在C++中,如果在标头中写入using namespace,那么它对包含该标头的任何人都有效。这使得它在标头中几乎不可用。在这一点上,您还可以在.cpp文件中避免它(在全局范围内),如果只是为了一致性,并使在.h和.cpp之间移动实现更容易的话。

(注意,局部作用域的using namespace(即在函数内)通常被认为是好的;只是它们对冗长没有太大帮助)

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

另一个原因是标准库的设计。在C++中,您只有std(好吧,现在它下面还有一些,但它们很少使用)。在C#中,您有像System.Collections.Generic这样的gem,它对于非常常用的东西来说非常冗长。在C#中避免using比在C++中要痛苦得多。

总之,虽然C#和C++确实有一些共同的设计,但在代码模块化问题上(我会将头、模块、名称空间都分配给该组),它们的设计非常不同。

对我来说,归根结底是支持工具。Visual Studio的Intellisense、快速类查找(F1键)和重构选项提供了所需的引用查找功能。

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

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

C++使用头文件来发布类声明,并且需要一个编译单元来实现(定义)这个类。对于C++来说,头文件中的using namespace <xxx>语句是非常不可取的做法,因为当从某些客户端代码中包含时,这很容易导致名称空间冲突和歧义。在类声明中,您应该明确地说明您希望从其他名称空间(包括std)中得到什么。

C#具有单个编译单元,这稍微简化了using namespace <xxx>语句的使用。尽管如此,如果您想避免乏味的键入,我还是更喜欢对导入的名称空间进行别名处理。将using语句放在.cs文件中也可能导致定义不明确。

虽然我完全同意其他人的观点,即不应该在头文件中使用名称空间,但我认为在cpp文件中禁止它们是短视的。如果您试图"很好地"将声明组织到命名空间中,但随后完全禁止使用"using namespace",则程序员阻力最小的路径将成为命名空间使用不足。

例如,在Pavel Minaev的上述文章中,他正确地指出了常见C++命名空间"std"和C#命名空间"System.Collections.Generic"之间的命名空间差异,因此,在C#中,您可以接受更详细的名称空间,因为它们在本质上使用起来并不痛苦。我相信C#中的名称空间组织比C++好得多,主要是因为这种文化差异,更好的类组织和一般可读性不是小事。

换言之,想想如果应用程序要求人们键入完全限定的路径来加载文件,人们的文件组织习惯会发生什么。他们更可能只是把所有东西都塞进根文件夹以避免打字,这不是提高组织质量的好方法。

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

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

最新更新