关于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"的命名空间。文本"?
- 或者我正在访问嵌套在"系统"命名空间内的"文本"命名空间?
如果"文本"嵌套在"系统"为什么只有"使用系统"包括所有的命名空间?我们应该显式地包含我们使用的每个命名空间吗?
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
{
}
}
}