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

本文关键字:空间结构 关于 | 更新日期: 2023-09-27 18:09:35

我对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;

我对这些结构的理解很困惑。我明白

using System;

表示我指的是系统命名空间

但是其他的呢,比如

using System.Text;

这是什么意思?

  • 我正在访问一个命名为"System"的命名空间。文本"?
  • 或者我正在访问嵌套在"系统"命名空间内的"文本"命名空间?

如果"文本"嵌套在"系统"为什么只有"使用系统"包括所有的命名空间?我们应该显式地包含我们使用的每个命名空间吗?

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

using System.Text;是否意味着我正在使用一个命名为"System"的命名空间?文本"或者我正在使用嵌套在"系统"名称空间中的"文本"名称空间?

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

注意当你说

namespace Foo.Bar.Blah
{
    class C 
    {
    ...

这是

的缩写形式
namespace Foo
{
    namespace Bar 
    {
        namespace Blah
        {
            class C 
            {
            ...

命名空间只有"简单"的名字。

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

通常你会,是的。在某些情况下,您可能不希望这样做。例如,如果您有两个名称空间,它们都包含相同名称的类型,并且您希望使用两个名称空间中的类型;在这种情况下,"使用"两个名称空间可能太令人困惑了。此外,"使用"使扩展方法发挥作用;如果有而不是想要绑定到的扩展方法,请不要包含包含它们的命名空间。

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

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

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

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

namespace Foo
{
    namespace Bar
    {
         class Blah {}
    }
}

在另一个文件中:

using Foo;
class Abc : Bar.Blah {}

using Foo;只包括直接在Foo内部声明的类型。它不会引入直接在Foo中声明的命名空间。c#的设计者认为把命名空间像这样"纳入作用域"太混乱了;通常人们使用using指令将类型 "纳入范围"。

对于计算机来说,名称空间大体上是没有层次的。System.Text(例如System.Text.StringBuilder)下的类型是而不是被认为是在System中-所以如果你想从两者中获得类型,你需要单独列出它们:

using System;
using System.Text;

它们被认为是编译器所关心的层次结构的唯一时候-无论如何,我能想到的-是当涉及到

中声明的命名空间时:
namespace Foo.Bar.Baz
{
    class Test
    {
    }
}

Test中,就好像您导入了Foo, Foo.Bar Foo.Bar.Baz

当然,从人类的理解角度来看,名称空间确实形成了层次结构——这使得查找东西变得容易。但总的来说,编译器和运行时不使用这种分层视图

我们应该显式地包含我们使用的每个命名空间吗?

是,或者完全限定类型名。

两个名称空间的使用

using System;
using System.Text;

是完全独立的。它们的名字暗示了一种关系,但在那些可以被认为是象征性的名称空间之外。

当你只有第一个使用System.Text的成员时,你不能使用CC_13的成员。你不需要用第一个来使用第二个。

只有当您编写属于嵌套命名空间的代码时,才会看到一些效果。

namesapce A
{
    namespace B
    {
        class Foo { }
    }
    namespace C
    {
        class Bar { private B.Foo f; }  // B is a 'relative' ns
    }
}

using System.Text导入System.Text中的所有声明,但不导入其文件夹中的任何声明。没有像Java那样的System.Text.* 等价,就像在一个虚构的语言中一样。

处理名称空间的一种简单方法是正常编写代码并按CTRL+。

您正在访问嵌套在系统命名空间中的文本命名空间。是的,您需要包含您使用的每个命名空间。

名称空间结构可以像下面这样:

namespace Parent
{
    namespace Child
    {
        public class ChildClass
        {
        }
    }
}