在C#中自动导入嵌套的命名空间

对不起,如果已经问过这个问题。 我开始研究C#并注意到C#不会自动导入嵌套的命名空间。 我不明白:

using System; 

应该自动导入System命名空间中包含的所有类吗? 所以我不需要写

 using System.Windows.Form; 

我会理解如果using Windows.Form甚至工作。 但是编译器无法解决它! using System;什么意义using System; 之前呢? 那么为什么要using System; 不自动导入System.Windows以及System.Windows.Forms – 对不起,如果这里的单词导入错误…也许移动到全局命名空间是正确的术语。

C#不是Java。

using指令 ,因此您不必键入类型的完全限定名称。 它还有助于消除类型名称的歧义(例如使用别名)。

例如,在Console的情况下,您不需要键入System.Console

理解命名空间和程序集之间的区别非常重要 – 命名空间是类型的逻辑分组。 程序集是类型的物理分组。 命名空间可以跨越程序集。

引用程序集时(这更像是在Java中导入包),您可以访问其中的所有公共类型。 要使用您需要唯一标识它的类型。 这是通过命名空间完成的 – using指令只是意味着您不必键入类型的完全限定名称。

using指令有两个用途:

允许在命名空间中使用类型,以便您不必限定在该命名空间中使用类型:

使用System.Text;

为命名空间或类型创建别名。 这称为使用别名指令。

使用Project = PC.MyCompany.Project;

http://msdn.microsoft.com/en-us/library/sf0df423.aspx

但是,您必须注意,System和System.Windows.Form无论如何都不通过名称本身连接。 如果导入(使用)系统,则意味着您将在此类中使用系统程序集类型。 在Visual Studio项目的引用部分指定的实际引用 ,您可以使用它(即使没有使用语句,因为这只是类型的快捷方式)。

C#不会导入嵌套的命名空间,这是设计使然。

命名空间范围允许您组织代码并为您提供创建全局唯一类型的方法。

嵌套命名空间用于对相关function进行分组,但是按需使用部分命名空间。

如果您需要的唯一东西是System.Windows我想您不希望拥有像System这样的大型命名空间中的所有类型。

所以可能问题是为什么C#没有using System.*; 像java一样。 我不知道答案,但我想这是因为KISS原则。 这就像使用一样

select *

你永远不会知道你将添加什么类型以及它们将如何影响现有代码。

即使在Java中,您也必须明确地编写

 import System.*; 

很多时候你不想要所有嵌套的命名空间。 这些只会使IntelliSense混乱。

“using”语法允许您快速访问已在项目设置中列为引用的名称空间。 如果命名空间被列为引用,则您可以通过它的全名访问它,而不使用“using”指令。 只需保存击键。

“使用”给定的命名空间意味着您将可以访问直接在其中实现的所有定义,而不是它将以递归方式查找嵌入的命名空间; 否则会破坏“使用”声明的目的。

存在命名空间以避免类名歧义。 当您知道可能没有(或很少)出现歧义时,“使用”语句用于避免使用嵌套在命名空间中的完全限定类型。

不,这不是它的工作原理。

而且我会对你所说的内容提出一个很好的论据:intellisnse会疯狂,找到你想要的东西会是地狱。

您可以访问每个可用命名空间(带点)的所有内容, using关键字简化了这一点,因为您不必指定类或结构来自哪个命名空间(我的意思是,已定义)。