有关命名空间的理解
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
}
提问:
这是C#编程语言详解一书原文:书中提到类型名”是一个“命名空间或类型名称”和命名空间名称”是一个“命名空间或类型名称”,,这句话无法理解,有高手是否能解释一下这是什么意思。
另外
“如果“命名空间或类型名称”出现在类或结构声明体内,则从该类或结构声明开始查找,遍及每个封闭它的类或结构声明(若它们存在的话),如果具有给定名称的成员存在、可访问且表示类型,则“命名空间或类型名称”引用该成员。请注意,当确定“命名空间或类型名称”的含义时,会忽略非类型成员(常数、字段、方法、属性、索引器、运算符、实例构造函数、析构函数和静态构造函数)。 ”
这段话也好像不好理解,因为命名空间出现在类声明体内,并不代表此命名空间包含在封闭它的类中呀
[解决办法]
如果看不懂,建议去看英文原文。因为看了你打的东西,的确翻译的很差劲。
[解决办法]
是啊,写的有点费解。命名空间只是一个逻辑概念而已,区分了一个程序集内同名问题,怎么说的这么复杂了,晕
[解决办法]
一个程序集
包含一个或多个命名空间
一个命名空间
包含一个或多个类
命名空间就是一种逻辑的分组
便于管理而已
[解决办法]
天哪,这谁写的谁翻译的啊?!
去看看 MSDN 中相关的章节吧,几句话就说清楚了,搞得这么复杂-_-!
[解决办法]
vengair(韦恩) 的是正解,死抠字面没有意义
[解决办法]
本懂一 看了之后 什么都又不懂了