[英]Confusion about C# Namespace Structure
我对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;
意味着我指的是System命名空间
但其他人喜欢什么呢
using System.Text;
那意味着什么?
此外,如果“Text”嵌套在“System”中,为什么只有“using System”包含所有命名空间? 我们是否应该明确包含我们使用的每个命名空间?
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
指令将类型 “带入范围”。
对于计算机而言,命名空间基本上不是分层的。 System.Text
下的类型(例如System.Text.StringBuilder
) 不被认为是在System
- 因此如果您想要两者中的类型,则需要单独列出它们:
using System;
using System.Text;
就编译器而言,它们被认为是层次结构的唯一时刻 - 无论如何,我能想到的是,当你在声明的东西中使用它时:
namespace Foo.Bar.Baz
{
class Test
{
}
}
在Test
,就好像你已经导入了Foo
, Foo.Bar
和 Foo.Bar.Baz
。
当然,命名空间确实从人类理解的角度形成层次结构 - 这使得查找事物变得容易。 但是,编译器和运行时总体上不使用事物的分层视图。
我们是否应该明确包含我们使用的每个命名空间?
是,或完全限定类型名称。
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
}
}
using System.Text
进口的所有声明里System.Text
,但没有在它的文件夹中。 没有System.Text.*
等同于Java,
就像想象中的语言一样。
处理命名空间的一种简单方法是正常编写代码和CTRL +。 在未定义的关键字上告诉VS.NET自动为您添加using
引用。
您正在访问嵌套在系统命名空间内的文本命名空间。 是的,您需要包含您使用的每个命名空间。
命名空间结构可能如下所示:
namespace Parent
{
namespace Child
{
public class ChildClass
{
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.