System.Collections是System命名空间的"命名空间"?

时间:2016-07-29 20:16:32

标签: c# .net namespaces

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

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

我问自己"为什么我不必通过写using System.DateTime"来在顶部引用它?

所以我意识到,因为DateTime是一个结构,而且"使用" keyword用于引用类型(类型是一个通用术语,用于引用集合{class,interface,structure,enumeration,delegate}中的成员),在特定名称空间中定义(在本例中,DateTime是类型结构中的系统命名空间)。

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

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

我想知道为什么using System后面的using指令是必要的,当它们都不属于System命名空间时,因此它们应该已被引用?

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

我希望我的问题很清楚,但如果没有,请告诉我,以便我可以编辑。

4 个答案:

答案 0 :(得分:24)

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

http://<VM IP>:8080/Project/index.jsp

'使用'做的是让你在''之前'无形地'引用一切。字符。所以当你写

http://<VM IP>:8080/Project/index.jsp

C#将尝试

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

包含了它下面的所有内容,然后很难确保事情不含糊。例如,如果您想区分两个理论类

System.Threading.Task.DateTime

然后一个普通的using System; System.WebPages.Button System.Desktop.Button 不相称。

答案 1 :(得分:3)

原因是,如果不是,那么在某些情况下你无法避免不必要的名称冲突。例如,如果Baz命名空间中的Foo类型和Baz命名空间中的Foo.Bar类型,则您必须完全限定类型,例如在您的代码中Foo.BazFoo.Bar.Baz会使using指令毫无意义。

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

答案 2 :(得分:2)

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

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

要创建新的List,但using语句允许您将其声明为:

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

你不能只用以下方式做后者的原因:

using System;

是因为System中可能有一个名为List的类,以及System.Collections.Generic中的List类。如果是这样,当您创建新的列表对象时,它如何知道您引用的List类?

因此,它们基本上用于防止命名冲突,并使程序员能够将事物分组为逻辑命名的组,例如:输入和输出相关的类可以在System.IO

中找到

答案 3 :(得分:1)

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

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

如果我使用Code,当我为我的文件夹结构分配命名空间时会发生同样的事情,例如projectName \ Code \ DBFiles;在我的一个控制器上,它没有给我DBFiles中的访问类,这就是我将所有类名空间设置为根命名空间的原因。