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

时间:2011-09-22 14:40:10

标签: c# namespaces

我对C#中的命名空间结构感到困惑 我是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;

表示我引用了System namespace

但其他人如

using System.Text;

这意味着什么?

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

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

5 个答案:

答案 0 :(得分:17)

  

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

后者。您正在使用嵌套在“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指令将类型“纳入范围”。

答案 1 :(得分:5)

对于计算机而言,命名空间基本上不是 层次结构。 System.Text下的类型(例如System.Text.StringBuilder被视为System - 所以如果您想要两种类型,则需要单独列出它们:

using System;
using System.Text;

就编译器而言,它们被认为是层次结构的唯一时刻 - 无论如何,我能想到的是,当你在声明的命名空间时:< / p>

namespace Foo.Bar.Baz
{
    class Test
    {
    }
}

Test内,就好像您已导入FooFoo.Bar Foo.Bar.Baz

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

答案 2 :(得分:1)

  

我们是否应该明确包含我们使用的每个命名空间?

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

2名称空间使用

using System;
using System.Text;

完全独立。他们的名字暗示了一种关系,但从外部可以被认为是象征性的名称空间。

当您只使用第一次使用时,您无法使用System.Text的成员 并且您不需要第一个才能使用第二个。

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

namesapce A
{
    namespace B
    {
        class Foo { }
    }

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

答案 3 :(得分:0)

using System.Text导入System.Text内的所有声明,但其文件夹中没有任何声明。没有System.Text.* 等同于Java ,就像想象中的语言一样。

处理命名空间的一种简单方法是正常编写代码和CTRL +。在未定义的关键字上告诉VS.NET自动为您添加using引用。

答案 4 :(得分:0)

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

命名空间结构可能如下所示:

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