C# 是系统.集合a“;系统名称空间的名称空间";?

C# 是系统.集合a“;系统名称空间的名称空间";?,c#,.net,namespaces,C#,.net,Namespaces,好的,我一直在读一本关于C#和.NET的书,在学习DateTime结构和以下代码的同时: DateTime dt = new DateTime(2015, 10, 17); 我问自己“为什么我不需要在顶部使用System.DateTime编写”来引用它呢?” 因此,我意识到,由于DateTime是一个结构,“using”关键字用于引用类型(类型是指集合{class,interface,structure,enumeration,delegate}中的成员的通用术语),定义在特定的命名空间中(在

好的,我一直在读一本关于C#和.NET的书,在学习DateTime结构和以下代码的同时:

DateTime dt = new DateTime(2015, 10, 17);
我问自己“为什么我不需要在顶部使用System.DateTime编写
”来引用它呢?”

因此,我意识到,由于DateTime是一个结构,“using”关键字用于引用类型(类型是指集合{class,interface,structure,enumeration,delegate}中的成员的通用术语),定义在特定的命名空间中(在本例中,DateTime是系统命名空间中的类型结构)

但我注意到,在我的文件顶部,可以找到以下使用指令(它们是在我创建C#console应用程序时自动放在那里的):

我想知道为什么必须使用
using System
之后的using指令,而它们不是都在系统名称空间下,因此应该已经被引用了

我猜这是因为它下面声明的所有名称空间都是名称空间,而不是集合{class,interface,structure,enumeration,delegate}中的类型。但是将它们称为“名称空间系统的名称空间(或属于名称空间系统的名称空间)”是错误的吗?如果是,您必须显式引用名称空间的名称空间,而不是将它们隐式包含在使用系统的
下的原因是什么

我希望我的问题是清楚的,但如果不是,请让我知道,以便我可以编辑它。

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


按照这种方式,如果您实际上对包含您的类型的两个名称空间都有
using
指令,则只需处理名称冲突。

创建一个using指令来使用名称空间中的类型,而不必指定名称空间。using指令不允许您访问嵌套在指定命名空间中的任何命名空间


当我被分配名称空间时也会发生同样的事情,因为如果我使用代码,我的文件夹结构会像projectName\Code\DBFiles;在我的一个控制器上,它不允许我访问DBFiles中的类,这就是为什么我将所有的类名空间都设置为根命名空间。

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

System.DateTime
System.Collections.Generic.Dictionary<string, int>
System.Threading.Tasks.Task
C#会努力的

由于只存在一个(
System.DateTime
),这是一个明确的匹配,C#知道您在说什么

如果有两个匹配项,则会出现关于歧义的编译器错误。因此,如果存在
System.Threading.Task.DateTime
,您的程序将无法编译

所有这些都为回答你的问题奠定了基础。如果

using System;
包括它下面的所有内容,那么就很难确保事情不含糊不清。例如,如果你想区分两个理论类

System.WebPages.Button
System.Desktop.Button

那么一个普通的使用系统的旧
就不能很好地使用
new按钮()

您不必有其他使用指令,例如,如果您想要一个列表,您可以在代码中声明:

System.Collections.Generic.List<String> listOfStrings = new System.Collections.Generic.List<String>;
是因为系统中可能有一个名为List的类,以及System.Collections.Generic中的List类。如果是这样,当您创建一个新的列表对象时,它如何知道您引用的是哪个列表类


因此,它们基本上用于防止命名冲突,并使程序员能够将事物分组到逻辑命名的组中,例如,可以在System.IO中找到与输入和输出相关的类,只是为了澄清您似乎存在的一个误解:示例中使用的都是名称空间。使用System.DateTime时,您永远不会有类似于
的东西,因为您永远不会有使用此语法的类(或结构)。使用
还有其他方法,如中所述。在名称解析方面,尽管结构和类(以及接口和您能想到的任何其他东西)的工作原理基本相同。
using System;
System.WebPages.Button
System.Desktop.Button
System.Collections.Generic.List<String> listOfStrings = new System.Collections.Generic.List<String>;
List<String> listOfStrings = new List<String>;
using System;