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




.net namespaces (3)

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

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中找到

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

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命名空间下,因此应该已经被引用?

所以我猜这是因为在它下面声明的所有名称空间 ,而不是从集{类,接口,结构,枚举,委托}的类型。 但是将它们称为“命名空间(或属于)命名空间系统”是错误的,如果是的话,你必须明确引用命名空间的命名空间的原因是什么,而不是隐式地包含在using System

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


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

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

同样的事情发生时,我分配我的文件夹结构像projectName \ Code \ DBFiles的命名空间的原因,如果我使用代码; 在我的控制器之一,它不给我在DBFiles的访问类,这就是为什么我把我所有的类名称空间设置为根命名空间。


在内部,所有.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#知道你在说什么。

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

所有这些都为你的问题提供了答案。 如果

using System;

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

System.WebPages.Button
System.Desktop.Button

那么一个普通的旧的using System不会和new Button()一起玩。





namespaces