是System.Collections;系统名称空间的名称空间”;

本文关键字:空间 系统 System Collections | 更新日期: 2023-09-27 17:59:25

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

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

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

因此,我意识到,由于DateTime是一个结构,并且"using"关键字用于引用在特定命名空间中定义的类型(类型是指集合{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}中的类型。但是,将它们称为"命名空间系统的(或属于)命名空间"是错误的吗?如果是,为什么必须显式引用命名空间的命名空间,而不是将它们隐式包含在using System下?

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

是System.Collections;系统名称空间的名称空间”;

在内部,所有.net类型都有完整的类型名;

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

"usings"的作用是让你"看不见"地引用"之前的所有内容性格所以当你写的时候

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

那么普通的旧CCD_ 6与CCD_。

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

按照这种方式,只有当您对包含您的类型的两个命名空间都有using指令时,才需要处理名称冲突。

您不必有其他using指令,例如,如果您想要一个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 中找到

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

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

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