C# 为什么是;使用制度&引用;不被认为是坏习惯吗? 我有C++背景,我完全理解并同意这个问题的答案:

C# 为什么是;使用制度&引用;不被认为是坏习惯吗? 我有C++背景,我完全理解并同意这个问题的答案:,c#,c++,using-directives,C#,C++,Using Directives,因此,我感到惊讶的是,现在有了一些C#方面的经验,我看到了完全相反的情况: 使用Some.Namespace被广泛使用。无论何时开始使用类型,都要首先为其名称空间添加一个using指令(如果还没有)。我想不起来曾经在使用系统时看到过一个不是以开头的.cs-文件;使用System.Collections.Generic;使用X.Y.Z;等等。。 事实上,如果您通过VisualStudio向导添加新文件,它会自动添加一些using指令,即使您可能根本不需要它们。所以,在C++社区中,你基本上被处以私

因此,我感到惊讶的是,现在有了一些C#方面的经验,我看到了完全相反的情况:
使用Some.Namespace
被广泛使用。无论何时开始使用类型,都要首先为其名称空间添加一个using指令(如果还没有)。我想不起来曾经在使用系统时看到过一个不是以
开头的
.cs
-文件;使用System.Collections.Generic;使用X.Y.Z;等等。
。 事实上,如果您通过VisualStudio向导添加新文件,它会自动添加一些using指令,即使您可能根本不需要它们。所以,在C++社区中,你基本上被处以私刑,C甚至鼓励这样做。至少在我看来是这样的

<>现在,我明白使用C和C++中的指令不是完全一样的。而且,我理解C++中使用命名空间< /代码>可以使用<代码>的最坏的事情之一,即将它放入头文件中,因为缺少头文件的概念,并且在C中没有等价的讨厌的对应项,而<代码>包含

<>但是,尽管它们有差异,但是使用C++和C++中的指令都是相同的目的,它只需要一直键入代码< >类型>代码>,而不是更长的<代码> >命名空间。出于同样的目的,危险对我来说似乎也是一样的:命名碰撞

在最好的情况下,这会导致编译错误,因此您“只”需要修复它。在最坏的情况下,它仍在编译,代码以静默方式执行与您预期不同的操作。所以我的问题是:<强>为什么(显然)使用C++和C++中的不相等的指令?< /强>

我有一些关于答案的想法(但没有一个真正让我满意):

    <> >命名空间在C中的使用时间要比C++中长得多,而且嵌套得更多(<代码> STD vs.因此,通过这种方式对代码进行去噪会带来更多的期望和收益。但即使这是真的,这个论点也只适用于标准名称空间。自定义的可以有任何短名称你喜欢,在C和C++。< /P> < /LI> <> >命名空间在C++中似乎比C++更精细。例如,在C++中,整个标准库包含在<代码> STD < /Cl>中(加上一些小的嵌套名称空间,如<代码>计时> <代码>),而在C中,您有“代码>系统.IO < /COD>,<代码>系统,线程<代码>,<代码>系统>文本< /代码>等。因此,命名冲突的风险较小。然而,这只是一种直觉。实际上,我没有计算您使用
    使用namespace std
    使用System
    导入了多少名称。同样,即使这是真的,这个参数也只适用于标准名称空间。你自己的设计可以按照你所希望的细粒度设计,在C和C++中。

还有更多的争论吗?我特别感兴趣的是真实的事实(如果有的话),而不是太多的意见

然而,尽管它们有差异,但是使用C和C++中的指令也有相同的目的,这只是需要一直在键入一些类型,而不是更长的Some.Namespace.SomeType(在C++中用::……)。出于同样的目的,对我来说,危险似乎也是:命名碰撞

是的,但你没有输出这种危险(读:强迫他人应对),因为:

<>现在,我明白使用C和C++中的指令不是完全一样的。而且,我明白,C++中使用命名空间可以做的最讨厌的事情之一,即把它放在头文件中,因为缺少头文件的概念,而C中没有等价的。 所以这是一个完全不同的类别

< C++ >不是用C++设计的IDE开发的。C#基本上都是在VisualStudio中编写的,带有智能感知等功能。它被设计成这样,被创造它的人使用。不管有多少人使用IDE在C++中开发,它并没有被设计成一个压倒一切的用例。

命名空间在C++中看起来比C++中的“细粒度”要多。

是的,也是这样
使用命名空间std
使用System.Collection.Generic
是不可比较的

所以不要比较它们

为什么“使用系统”不被认为是坏习惯

“使用系统”是普遍认为不好的做法。例如,见:

但是,使用名称空间std并不像
那么糟糕,这可能是真的。可能是因为:

  • C#没有头文件。使用预处理器将一个C#源文件“包含”到另一个C#源文件中是不常见的

  • std
    名称空间几乎是扁平的,即几乎所有标准库函数、类型和变量都在其中(很少有例外,例如文件系统子名称空间)。它包含非常非常多的标识符。据我所知,
    System
    包含的名称少得多,而子名称空间更多

  • 在C#中,没有全局函数或变量。因此,全局标识符的数量通常与C++相比非常小,而C++确实具有这些:此外,典型地使用没有名字空间的C库(通常是间接的),因此将所有的名字放入全局命名空间。

  • 据我所知,C#没有依赖于参数的查找。ADL与名称隐藏、重载等结合会产生一些情况,其中一些程序不受名称冲突的影响,而另一些程序则受到微妙的影响,并捕获所有角ca