jxr*_*mos 1 c# c++ namespaces hierarchy layer
我知道C#支持命名空间嵌套,C++也是如此,它们都允许看起来像这样的代码......
namespace A {
namespace B {
...
}
}
Run Code Online (Sandbox Code Playgroud)
来自C++背景并潜入C#世界我一直在思考通过所有必须发布以利用.NET的使用指令来显示为组件的分层嵌套,例如
using System.Collections;
using System.Collections.Generic;
Run Code Online (Sandbox Code Playgroud)
我确信Microsoft打算并设计这些库在逻辑上是按层次结构组织的,但是在没有查看源代码的帮助下我无法验证System.Collections.Generic是否具有Generic作为集合的嵌套命名空间,但我认为它是,并且它是通过命名空间嵌套完成的,就像在A和B中看到的那样.现在,一旦我开始在我自己的源代码中编写东西并声明看起来像这样的代码
namespace C.D {
...
}
Run Code Online (Sandbox Code Playgroud)
我到底在层次结构方面取得了什么成就?我向代码介绍了一个单一的命名空间标识符"CD",其中'.' 是一种友好的方式,可以建议一个层次结构,根据代码结构可能存在也可能不存在,或者我隐含地声明两个名称空间"C"和"D",其中D嵌套在C中?我在为我们的C#代码库编写一个DevelopmentApplications命名空间时遇到了这个问题,该代码库旨在严格包含用于增强我们的软件以帮助其开发的所有开发工具.在那些工具中,我从来没有声明一个独立的封闭命名空间DevelopmentApplications(这是我在C++中必须做的事情)......
namespace DevelopmentApplications
{
...
}
Run Code Online (Sandbox Code Playgroud)
...但总是创建类似的应用程序
namespace DevelopmentApplications.MyDevelopmentApp
{
...
}
Run Code Online (Sandbox Code Playgroud)
我知道这个区域是一些混乱的原因,因为下面的问题,作者正在努力理解Foo.Bar.Baz和Foo.Bar之间的关系.还有一个反向问题是C#开发人员进入C++领域,可以深入了解这个问题.
我想另一种说明问题的方法是在C++中使用'::'运算符来完全限定类型我知道保证声明的类型的代码嵌套在某个命名空间层次结构中.但在C#中使用'.' 运算符要完全限定某些类型必须在某些深层嵌套的命名空间层次结构中存在该类型吗?我在这里假设C#使用像ABC这样的命名空间并不一定需要AB和C之间的层次关系,或者AB或C甚至作为单独的命名空间存在.
如果有人能够找到或知道有关此语法的相关语言规范,我很乐意阅读它.
C#4.0规范的第9.2节规定:
所述合格的标识符一个的名称空间声明可以是单一的标识符或由""标记分隔的标识符的序列.后一种形式允许程序定义嵌套的命名空间,而不用词法嵌套多个命名空间声明.例如,
Run Code Online (Sandbox Code Playgroud)namespace N1.N2 { class A {} class B {} }在语义上等同于
Run Code Online (Sandbox Code Playgroud)namespace N1 { namespace N2 { class A {} class B {} } }
你说:
我在这里假设C#使用像ABC这样的命名空间并不一定需要AB和C之间的层次关系,或者AB或C甚至作为单独的命名空间存在.
这种假设是错误的.命名空间A.B.C必然涉及命名空间A中的全局命名空间,命名空间B的命名空间内A,和命名空间C的命名空间B.