C#中的命名空间和子命名空间

5

关于C#的初学者问题。

每个程序都需要包含几个命名空间,例如:

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

为什么我需要包含以下内容:
using System.Collections.Generic;
using System.Linq;
using System.Text;

由于它们与第一个相结合,所以不需要再次包含它们:

using System;

提前感谢您!


你不必完全包含任何命名空间。它不会将任何内容包含到程序集中,只是使命名空间中的类可以从全局命名空间访问。所有名称在编译时都将解析为其完全限定名称。 - Rotem
8个回答

8
因为嵌套的命名空间不包含在父命名空间中。有关详细信息,请参阅using directive文档

using指令不能让您访问嵌套在指定命名空间中的任何命名空间。


但是我可以在没有最后三个的情况下运行相同的程序。 - user198003
1
因为这三个命名空间包含的扩展很可能会有用:通用集合(例如 IEnumerable<int>),LINQ 扩展和文本处理工具。实际上,应用程序运行时甚至不需要 System,但是这样的应用程序没有多少用处(你甚至无法输出任何内容,因为 Console 类在 System 命名空间中)。 - J0HN
@user198003,Visual Studio默认放置这些文件,因为它们包含经常使用的类。如果您不需要它们,可以将其删除。无论哪种方式,都不会对生成的程序集产生影响。 - Rotem
@user198003,那是因为你没有使用那三个命名空间的任何功能。如果你创建一个新类,默认情况下它们会在那里,尝试使用StringBuilder、LINQ查询,你可能无法运行它。 - wizzardz
我经常将“System.Linq”重命名为“System.IO”,因为我更经常使用后者而不是前者。这样可以节省一点打字时间。 - Polyfun
显示剩余2条评论

2

SystemSystem.Text 是两个不同的命名空间。我们作为程序员赋予了System.TextSystem 的一部分这样的语义。从平台视角来看,不存在嵌套的命名空间;

但即使不是这种情况,如果您有这样一个情况,会发生什么:

namespace MySystem{
   namespace Foo{
       class Bar {...}
   }

   class Bar{...}
}

using MySystem;
class MyClass{
    private Bar _myBar; //Which one is it MySystem.Foo.Bar or MySystem.Bar?     
}

2

SystemSystem.IO命名空间是不同的。

在对象模型中,您可以将“子命名空间”视为父子关系。如果您可以访问“Car”对象,并不意味着您可以访问汽车的轮子。

System是一个包含数百个嵌套命名空间和数千个类的巨大命名空间。您应该单独指定所有嵌套命名空间,以说明您感兴趣的模块的哪一部分。


2
假设这些命名空间中有以下类(最后一个是类名):
A.B.Class1
A.Class2
现在你拥有以下内容: using A - 允许你直接引用Class2…但无法引用Class1。 using A.B - 允许你直接引用Class1,但无法引用Class2。
如果你想在代码中直接引用两个类,就需要同时使用这两个usings。

0

只是为了让您更清楚地理解,这里添加一个示例。

子命名空间无法通过调用父命名空间来访问。

Namespace Main  //only code and classes are accessible
{
  //code for Main Namespace
  Namespace subMain     //only code and classes are accessible
  {
     //code for subMain
     Namespace verySubMain  //only code and classes are accessible
     {
        //code for verySubMain
     }
     Namespace otherVerySubMain  //only code and classes are accessible
     {
        //code for otherVerySubMain
     }
  }
}

您能解释一下这个回答如何回答问题吗? - J0HN
@J0HN 这并没有回答问题,只是为了让 OP 更清楚地理解而举的例子。正如我在帖子中提到的那样。 - Mr_Green

0

既然你是初学者,让我澄清一件事情:C#中的namespaceJava中的package是不同的东西,不需要将它们合并。


0

.Net中并不是所有的类都在一个大容器中。这样做会增加类名冲突的机会,并且一开始也看起来不太好。命名空间是容器,旨在使您的库保持清洁并更有意义。将FTP类和String类放在一个容器中没有任何逻辑上的意义。它们执行两个不同的操作,应该分别放在不同的容器中。

此外,命名空间可以嵌套。有时一个命名空间几乎只有另一个命名空间,而没有任何类。所以要访问类,您需要在使用之前限定完整的命名空间。

在您的情况下,您使用不同的类,它们位于不同的容器中。因此,如果您需要使用它们,您需要使用它们的命名空间进行限定。


-1
如果您想在没有使用语句的情况下访问 System.Text 中的一个类,那么每次想要使用它时都必须输入 Text."类/函数名称"。
这种方式可以直接调用 "类/函数名称"。
不确定您是否是初学者,但这是我能描述的最简单的方法。

命名空间不能包含函数。 - Miguel Angelo
我知道,但我的意思是在该命名空间内的类中的一个函数。 - nemstr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接