我有一定的C++背景,我完全理解并同意这个问题的答案:为什么“using namespace std;”被认为是不良实践?
因此,我很惊讶的发现,在使用C#后,完全相反的情况发生了:
现在,我明白了 C# 和 C++ 中的 using 指示符并不完全相同。此外,我也明白,使用
using Some.Namespace;
几乎随处可见。每当你开始使用一个类型时,你首先会添加它所在命名空间的 using 指令(如果还不存在)。我不能回忆起看到过不以using System; using System.Collections.Generic; using X.Y.Z; etc...
开始的 .cs 文件。
事实上,即使你可能根本不需要它们,如果你通过 Visual Studio 向项目中添加新文件,它也会自动在那里添加一些 using 指示符。所以,在 C++ 社区中你会受到基本上的谴责,而 C# 却鼓励这样做。至少在我看来是这样的。现在,我明白了 C# 和 C++ 中的 using 指示符并不完全相同。此外,我也明白,使用
using namespace
在 C++ 中最糟糕的事情之一,即将它放在头文件中,在 C# 中没有等价的糟糕情况,这是由于缺乏头文件和#include
的概念。然而,尽管它们存在差异,但在C#和C ++中使用指示符具有相同的目的,即不必一直输入Some.Namespace.SomeType
(在C ++中为:: 而不是 .
),而只需输入 SomeType
。但是出于同样的目的,危险似乎对我来说也是相同的:命名冲突。
在最好的情况下,这会导致编译错误,因此您只需要修复它。在最坏的情况下,它仍然可以编译,并且代码默默地执行与您打算执行的不同操作。因此,我的问题是:为什么在C#和C ++中显然使用指示符被认为是如此不平等的?
我有一些回答的想法(尽管没有一个真正让我满意):
C#中的命名空间通常比C ++中更长且更嵌套(std
vs. System.Collection.Generic
)。因此,在消除代码方面有更多的愿望和更大的收益。但即使如此,该论点仅适用于标准命名空间。自定义命名空间可以在C#和C ++中拥有任何短名称。
在C#中,命名空间比C++更加“细粒度”。例如,在C++中,整个标准库都包含在std
中(还有一些嵌套的小命名空间,如chrono
),而在C#中,您有System.IO
,System.Threading
,System.Text
等。因此,发生名称冲突的风险较小。但是,这只是一种直觉感觉。我没有实际计算过使用using namespace std
和using System
导入了多少名称。而且,即使这是真的,在查看标准命名空间时才适用这个论点。无论是在C#还是C++中,您自己的命名空间都可以设计得像细粒度一样。
还有其他的论点吗?我特别关心实际的硬性事实(如果有的话),而不是那些意见。
Ext(this T t, long l)
并通过t.Ext(0)
调用它。如果您添加了另一个包含扩展方法Ext(this T t, int i)
的命名空间,则会调用该方法。但我还不是 C# 的专家。 - sebrockm