有关命名空间的理解
C# 程序中的若干上下文要求指定命名空间名称或类型名称。两种形式的名称都写为以“.”标记分隔的一个或多个标识符。
namespace-name:(命名空间名称:)
namespace-or-type-name(命名空间或类型名称)
type-name:(类型名:)
namespace-or-type-name(命名空间或类型名称)
namespace-or-type-name:(命名空间或类型名称:)
identifier(标识符)
namespace-or-type-name . identifier(命名空间或类型名称 . 标识符)
“类型名”是一个“命名空间或类型名称”,它引用一个类型。需遵循下述的决策:“类型名”的“命名空间或类型名称”必须引用一个类型,否则将发生编译时错误。
“命名空间名称”是一个“命名空间或类型名称”,它引用一个命名空间。需遵循下述的决策:“命名空间名称”的“命名空间或类型名称”必须引用一个命名空间,否则将发生编译时错误。
“命名空间或类型名称”的含义按下述步骤确定。
l 如果“命名空间或类型名称”由单个标识符组成:
t 如果“命名空间或类型名称”出现在类或结构声明体内,则从该类或结构声明开始查找,遍及每个封闭它的类或结构声明(若它们存在的话),如果具有给定名称的成员存在、可访问且表示类型,则“命名空间或类型名称”引用该成员。请注意,当确定“命名空间或类型名称”的含义时,会忽略非类型成员(常数、字段、方法、属性、索引器、运算符、实例构造函数、析构函数和静态构造函数)。
t 否则,从发生“命名空间或类型名称”的命名空间开始,遍及每个封闭它的命名空间(若它们存在的话),直至全局命名空间结束,对下列步骤进行评估,直到找到实体。
Ø 如果命名空间包含具有给定名称的命名空间成员,则“命名空间或类型名称”引用该成员,并根据该成员归为命名空间或类型类别。
Ø 否则,如果命名空间有一个对应的命名空间声明,且“命名空间或类型名称”出现的位置包含在该命名空间声明中,则:
‐如果该命名空间声明包含一个将给定名称与一个导入的命名空间或类型关联的 using 别名指令,则“命名空间或类型名称”引用该命名空间或类型。
‐否则,如果该命名空间声明中有一个“using 命名空间指令”,它导入的那个命名空间内含有一个与给定名称完全匹配的类型,则“命名空间或类型名称”引用该类型。
‐否则,如果该“using 命名空间指令”导入的命名空间包含多个具有给定名称的类型,则“命名空间或类型名称”被认为是含义不清的,将导致发生错误。
t 否则,“命名空间或类型名称”就被认为是未定义的,导致发生编译时错误。
l 否则,“命名空间或类型名称”的形式为 N.I,其中 N 是由除最右边的标识符以外的所有标识符组成的“命名空间或类型名称”,I 是最右边的标识符。N 最先按“命名空间或类型名称”解析。如果对 N 的解析不成功,则发生编译时错误。否则,N.I 按下面内容解析。
t 如果 N 是一个命名空间而 I 是该命名空间中可访问成员的名称,则 N.I 引用该成员,并根据该成员归为命名空间或类型类别。
t 如果 N 是类或结构类型而 I 是 N 中可访问类型的名称,则 N.I 引用该类型。
t 否则,N.I 是无效的命名空间或类型名称并将发生编译时错误。
每个命名空间和类型都具有一个完全限定名,该名称在所有其他命名空间或类型中惟一标识该命名空间或类型。命名空间或类型 N 的完全限定名按下面这样确定:
l 如果 N 是全局命名空间的成员,则它的完全限定名为 N。
l 否则,它的完全限定名为 S.N,其中 S 是声明了 N 的命名空间或类型的完全限定名。
换言之,N 的完全限定名是从全局命名空间开始通向 N 的标识符的完整分层路径。由于命名空间或类型的每个成员都必须具有惟一的名称,因此,如果将这些成员名称置于命名空间或类型的完全限定名之后,这样构成的成员完全限定名一定符合惟一性。
下面的示例显示了若干命名空间和类型声明及其关联的完全限定名。
class A {} // A
namespace X // X
{
class B // X.B
{
class C {} // X.B.C
}
namespace Y // X.Y
{
class D {} // X.Y.D
}
}
namespace X.Y // X.Y
{
class E {} // X.Y.E