2011-09-22 107 views
4

我对命名空间在C# 我是新的C#结构和WPF有点糊涂混淆C#命名空间结构

当我创建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; 

就是说IM参照系统命名空间

但对于其他人一样

using System.Text; 

这是什么意思?

  • 我在访问名为“System.Text”的单个命名空间吗?
  • 或我正在访问嵌入“系统”命名空间内的“文本”命名空间?

此外,如果“文本”嵌套在“系统”内,为什么只有“使用系统”包含所有的命名空间?我们是否必须明确包含我们使用的每个名称空间?

+0

VS有一个菜单项来清理该列表(删除未使用的用户) –

+0

注意:您还可以使用[使用别名指令](http://msdn.microsoft.com/zh-cn/library/sf0df423。 ASPX)。如果由于冲突而无法包含名称空间,则使用别名指令可能会是一个好替代。 – Brian

回答

15

是否using System.Text;意味着我用命名为“System.Text” 单个命名空间或我使用了“文本“命名空间嵌套在”系统“命名空间内?

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

注意,当你说

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

这只是写

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

命名空间只有“简单”的名字的缩写形式的方式。

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

通常你会的,是的。有些情况下你可能不想这样做。例如,如果您有两个名称空间都包含一个相同名称的类型,并且您想使用两个名称空间中的类型,在这种情况下,使用两个名称空间可能会令人困惑。另外,“使用”带来了扩展方法;如果有你想要绑定的扩展方法而不是,请不要包含包含它们的名称空间。

如果“文本”嵌套在“系统”中,为什么只有“使用系统”包含所有的名称空间?

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

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

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

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

在不同的文件中:

using Foo; 
class Abc : Bar.Blah {} 

using Foo;只包括类型直接声明中富。它不会带入命名空间直接在Foo中声明。 C#的设计者认为把命名空间“纳入范围”是太混乱了;通常人们使用using指令将类型“纳入范围”。

+0

感谢它帮助了很多 – ammar26

+0

System.Text是'System'命名空间中嵌套的'Text',还是简单的名字是'System.Text',真的有区别吗?就我而言,你(a)定义一个名称为“Foo.Bar.Blah”的类(b)不允许在同一个项目中使用名称为“Foo”或“Foo.Bar”的类和c)有一个'使用Foo.Bar'的助手,它是'使用别名Blah = Foo.Bar.Blah'的捷径。 – configurator

+1

@configurator:这确实是另一种看待它的方式,实际上是CLR看待它的方式。 “名称空间”在CLR类型系统中不是一个概念;相反,每种类型实际上都有其完全合格的名称,并带有点。 –

1

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

是或完全限定类型名称。

的2命名空间usings

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 
    } 
} 
+0

好的,谢谢,但是结构呢?它是嵌套还是单个命名空间? – ammar26

+0

嵌套结构表示“逻辑”关系,但没有真正的语义。 –

5

命名空间是,总的来说,其意义的电脑不分层。 System.Text(例如System.Text.StringBuilder)是认为是System - 所以你需要单独列出来,如果你想从两个类型:

using System; 
using System.Text; 

时,他们就认为是一个层次的唯一一次编译器而言 - 这是我能想到的,反正 - 是当它涉及到的命名空间,你声明东西:

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

Test,就好像你已经导入FooFoo.BarFoo.Bar.Baz

现在当然命名空间从人类理解的角度来看形式层次结构 - 使它很容易找到事物。但是编译器和运行时间基本上不使用事物的分层视图。

0

using System.Text导入System.Text内的所有声明,但其文件夹中没有任何内容。没有System.Text.* 与Java 类似,如同虚构的语言。

处理命名空间的一个简单方法就是正常编写代码和CTRL +。通过未定义的关键字告诉VS.NET自动为您添加using参考。

+0

更准确地说,* all *使用伪指令的非别名就像'import System.Text。*;'将使用Java。没有相当于Java的单一类型导入,例如'import java.util.Map;' - 你不能写'使用System.Collections.Generic.IEnumerable ;' –

+0

Err我想'。*'也添加了所有的子命名空间。自从我使用Java以来​​,已经有很长一段时间了。 – Blindy

+0

不是,它不是 - 它是*包内的所有类型*。 –

0

您正在访问嵌套在System Namespace内的Text Namespace。是的,你需要包括你使用的每个名字空间。

命名空间结构看起来类似以下内容:

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

语法错误* 6 –

+0

“类似于下面的内容” –

+0

@亨克,好吧,我看到四个,其他两个在哪里:o – Blindy