关于C#命名空间结构的困惑

amm*_*r26 5 c# namespaces

我对C#中的Namespace结构感到困惑,我是C#和WPF的新手

当我创建一个WPF的新项目时,默认情况下这些命名空间包含在顶部

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
Run Code Online (Sandbox Code Playgroud)

我很难理解这些结构.我明白那个

using System;
Run Code Online (Sandbox Code Playgroud)

意味着我指的是System命名空间

但其他人喜欢什么呢

using System.Text;
Run Code Online (Sandbox Code Playgroud)

那意味着什么?

  • 我正在访问一个名为"System.Text"的命名空间?
  • 或者我正在访问嵌套在"System"命名空间内的"Text"命名空间?

此外,如果"Text"嵌套在"System"中,为什么只有"using System"包含所有命名空间?我们是否应该明确包含我们使用的每个命名空间?

Eri*_*ert 17

是否using System.Text;意味着我使用名为"System.Text"的单个命名空间或者我使用嵌套在"System"命名空间内的"Text"命名空间?

后者.您正在使用嵌套在"System"命名空间内的"Text"命名空间.

请注意,当你说

namespace Foo.Bar.Blah
{
    class C 
    {
    ...
Run Code Online (Sandbox Code Playgroud)

这只是一种简短的写作方式

namespace Foo
{
    namespace Bar 
    {
        namespace Blah
        {
            class C 
            {
            ...
Run Code Online (Sandbox Code Playgroud)

命名空间只有"简单"的名称.

我们应该为每个使用的命名空间都有一个明确的'using'指令吗?

通常你会这样做,是的.在某些情况下,您可能不想这样做.例如,如果您有两个名称空间,它们都包含同名的类型,并且您希望使用两个名称空间中的类型; 在这种情况下,拥有两个名称空间的"使用"可能会让人感到困惑.此外,"使用"带来了扩展方法; 如果有,你扩展方法希望绑定到,不包括包含它们的命名空间.

如果"Text"嵌套在"System"中,为什么只有"using System"包含所有命名空间?

我不明白这个问题的措辞.我想也许你在问:

为什么不using System;将简单名称Text解析为嵌套命名空间?

也就是说,为什么这不起作用:

namespace Foo
{
    namespace Bar
    {
         class Blah {}
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个文件中:

using Foo;
class Abc : Bar.Blah {}
Run Code Online (Sandbox Code Playgroud)

using Foo;只包括类型直接声明中富.它不会引入直接在Foo中声明的名称空间.C#的设计者认为将名称空间"纳入范围"这样过于混乱; 通常人们使用using指令将类型 "纳入范围".


Jon*_*eet 5

对于计算机而言,命名空间基本上不是分层的.System.Text(例如System.Text.StringBuilder)下的类型被认为是System- 如果您想要两者的类型,则需要单独列出它们:

using System;
using System.Text;
Run Code Online (Sandbox Code Playgroud)

就编译器而言,它们被认为是层次结构的唯一时刻 - 无论如何,我能想到的是,当你在声明的东西中使用它时:

namespace Foo.Bar.Baz
{
    class Test
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

在内部Test,就好像你已经导入了Foo,Foo.Bar Foo.Bar.Baz.

当然,命名空间确实从人类理解的角度形成层次结构 - 这使得查找事物变得容易.但是,编译器和运行时总体上不使用事物的分层视图.