System.Collections是“System命名空间的命名空间”吗?

System.Collections是“System命名空间的命名空间”吗?

问题描述:

好了,所以我一直在读一本关于C#和.NET,并同时学习有关的DateTime结构和下面的代码:System.Collections是“System命名空间的命名空间”吗?

DateTime dt = new DateTime(2015, 10, 17); 

我问自己“为什么没有我要引用它在顶部写using System.DateTime“?

所以我意识到由于DateTime是一个结构,并且“using”关键字用于引用类型(类型是一个通用术语,指的是集合{class,interface,structure,enumeration,delegate中的成员} ),在特定的命名空间中定义(在这种情况下,DateTime是来自System Namespace的类型结构)。

但是我注意到,在我的文件的顶部,下面用指令被发现(当我建立了我的C#控制台应用程序,他们会自动放在那里):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

我为什么用指令疑惑后面的using System是必要的,那么它们是不是都在System命名空间下,因此它们应该已经被引用?

所以我猜这是因为所有下面声明的是命名空间,而不是来自set {class,interface,structure,enumeration,delegate}的类型。但是将它们称为“命名空间OF(或属于)命名空间System”是错误的,如果是这样,你必须明确引用命名空间的名称空间而不是隐含地包含在using System之下的原因是什么?

我希望我的问题很明确,但如果没有,请让我知道,以便我可以编辑它。

+1

只是为了澄清你似乎有一个误解:在你的例子中使用后面是所有的命名空间。你永远不会有像使用System.DateTime这样的东西,因为你从来没有使用这种语法的类(或结构体)。还有其他方法可以使用https://msdn.microsoft.com/en-us/library/sf0df423.aspx中介绍的'using'。就名称解析而言,尽管结构和类(以及可以想到的接口和其他任何东西)的工作方式都差不多。 – Chris

在内部,所有.net类型始终具有完整的类型名称;

System.DateTime 
System.Collections.Generic.Dictionary<string, int> 
System.Threading.Tasks.Task 

“使用方法”的作用是让您在“隐藏”之前引用'隐藏'。字符。所以,当你写

DateTime 

C#将尝试

System.DateTime 
System.Collections.Generic.DateTime 
System.Linq.DateTime 
System.Text.DateTime 
etc... 

由于只有一个存在(System.DateTime)这是一个明确的比赛,和C#知道你在说什么。

如果有两个匹配,你会得到一个关于歧义的编译器错误。所以如果 a System.Threading.Task.DateTime,那么你的程序就不会编译。

所有这些设置了问题答案的场景。如果

using System; 

包括它下面的所有内容,那么它将很难确保事物不含糊。例如,如果你想两个理论类

System.WebPages.Button 
System.Desktop.Button 

区分那么一个普通的老using System不会发挥好与new Button()

原因是,如果它不是那样,您在某些情况下无法避免不想要的名称冲突。例如,如果您在Foo名称空间中有一个Baz类型,并且在Foo.Bar名称空间中有一个Baz类型,那么您总是必须对您的类型进行完全限定。 Foo.BazFoo.Bar.Baz,在您的代码中,这将使using指令毫无意义。

考虑到它的方式,如果实际上对于包含类型的两个命名空间都有using指令,则只需处理名称冲突。

创建using指令以使用名称空间中的类型,而无需指定名称空间。 using指令不允许您访问嵌套在指定名称空间中的任何名称空间。

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

当我喜欢我的项目名\代码\ DBFILES文件夹结构的分配命名空间的原因,如果我不使用代码同样的事情发生;在我的一个控制器中,它不会给我DBFiles中的访问类,这就是为什么我将所有类名称空间都设置为根名称空间的原因。

您不必有其他使用指令,例如如果你想要一个清单,你可以只在声明代码:

System.Collections.Generic.List<String> listOfStrings = new System.Collections.Generic.List<String>; 

要创建一个新的列表,但使用的语句让你简单地声明为:

List<String> listOfStrings = new List<String>; 

的原因,你不能做后者只有:

using System; 

是因为有可能在系统名为List类,以及在System.Collections.Generic的List类。如果是这样,当你创建一个新的列表对象时,它如何知道你指的是哪个List类?因此,它们基本上用于防止命名冲突,并使程序员能够将事物分组为逻辑上命名的组,例如,输入和输出相关的类可以在System.IO