(原创)c#学习笔记03--变量和表达式04--表达式04--命名空间
3.4.4 名称空间
在继续学习前,应花一定的时间了解一个比较重要的主题——名称空间。它们是.NET中提供应用程序代码容器的方式,这样就可以唯一地标识代码及其内容。名称空间也用作.NET Framework中给项分类的一种方式。大多数项都是类型定义,例如,本章描述的简单类型(System.Int32等)。
默认情况下,C#代码包含在全局名称空间中。这意味这对于包含在这段代码中的项,只要按照名称进行引用,就可以由全局名称空间中的其他代码访问它们。可以使用namespace关键字为花括号中的代码块显式定义名称空间。如果在该名称空间代码的外部使用名称空间中的名称,就必须写出该名称空间中的限定名称。
限定名称包括它所有的分层信息。这基本上意味着,如果一个名称空间中的代码需要使用在另一个名称空间中定义的名称,就必须包括对该名称空间的引用。限定名称在不同的命名空间级别之间使用句点字符(.)。如下所示:
namespace LevelOne
{
// code in LevelOne namespace
// name "NameOne" defined
}
// code in global namespace
在名称空间LevelOne中编写的代码可以使用NameOne来引用该名称,不需要任何分类信息。但全局名称空间中的代码必须使用分类名称LevelOne.NameOne来引用这个名称。
note: 根据约定,名称空间通常采用PascalCase命名方式。
在名称空间中,使用关键字namespace还可以定义嵌套的名称空间。嵌套的名称空间通过其层次结构来引用,并使用句点区分层次结构的层次。如下:
namespace LevelOne
{
// code in LevelOne namespace
namespace LevelTwo
{
// code in LevelOne.LevelTwo namespace
// name "NameTwo" defined
}
}
// code in global namespace
在全局名称空间中,NameTwo必须引用为LevelOne.LevelTwo.NameTwo;在LevelOne名称空间中,可以引用为LevelTwo.NameTwo;在LevelOne.LevelTwo名称空间中,可以引用为NameTwo。
非常重要的一点是,名称是由名称空间唯一定义的。可以在LevelOne和LevelTwo名称空间中定义名称NameThree:
namespace LevelOne
{
// name "NameThree" defined
namespace LevelTwo
{
// name "NameThree" defined
}
}
这定义了两个不同的名称LevelOne.NameThree和LevelOne.LevelTwo.NameThree。可以独立使用它们,互不干扰。
创建了名称空间后,即可使用using语句简化对它们所含名称的访问。实际上,using语句的意思是“我们需要这个名称空间中的名称,所以不要每次总是要求对它们分类”。例如,在下面的代码中,LevelOne名称空间中的代码可以访问LevelOne.LevelTwo名称空间中的名称,而无需分类:
namespace LevelOne
{
using LevelTwo;
namespace LevelTwo
{
// name "NameTwo" defined
}
}
LevelOne命名空间中的代码现在可以直接使用NameTwo引用LevelTwo.NameTwo。
有时,与上面的NameThree示例一样,不同名称空间中的相同名称会产生冲突,使系统崩溃(此时,代码无法编译,编译器会告诉我们名称有冲突)。此时,可以使用using语句为名称空间提供一个别名。
namespace LevelOne
{
using LT = LevelTwo; // 别名
// name "NameThree" defined
namespace LevelTwo
{
// name "NameThree" defined
}
}
LevelOne 名称空间中的代码可以把LevelOne.NameThree 引用为NameThree,把LevelOne.LevelTwo.NameThree引用为LT.NameThree。
using语句可以应用到包含它们的名称空间,以及该名称空间中包含的嵌套命名空间。在上面的代码中,全局名称空间不能使用LT.NameThree。但如果using语句声明如下:
using LT = LevelOne.LevelTwo;
namespace LevelOne
{
// name "NameThree" defined
namespace LevelTwo
{
// name "NameThree" defined
}
}
全局名称空间中的代码和LevelOne名称空间中的代码就可以使用LT.NameThree。
需要注意特别重要的一点:using语句本身不能访问另一个名称空间中的名称。