【发布时间】:2015-02-15 08:06:43
【问题描述】:
我知道 C# 支持命名空间嵌套,就像 C++ 一样,它们都允许看起来像这样的代码...
namespace A {
namespace B {
...
}
}
来自 C++ 背景并潜入 C# 世界,我一直在沉思通过所有使用 .NET 必须发出的指令来显示组件的分层嵌套,例如
using System.Collections;
using System.Collections.Generic;
我确信 Microsoft 打算并将这些库设计为在逻辑上按层次组织,但如果没有查看源代码的帮助,我无法验证 System.Collections.Generic 是否具有 Generic 作为 Collections 的嵌套命名空间,但我认为它是,并且它是通过命名空间嵌套来完成的,就像在 A 和 B 中看到的那样。现在,一旦我开始在自己的源代码中编写东西并声明看起来像这样的代码
namespace C.D {
...
}
相对于层次结构,我在这里实现了什么?我是否在代码中引入了一个单一的命名空间标识符“C.D”,其中“。”只是一种友好的方式来建议可能存在或可能不存在的层次结构,具体取决于代码结构,还是我隐含地声明了两个命名空间“C”和“D”,其中 D 嵌套在 C 中?我在为我们的 C# 代码库编写 DevelopmentApplications 命名空间时遇到了这个问题,该命名空间旨在严格包含用于增强我们的软件以帮助其开发的所有开发工具。在这些工具中,我从未声明过独立的封闭命名空间 DevelopmentApplications(这是我在 C++ 中必须要做的事情)...
namespace DevelopmentApplications
{
...
}
...但总是创建类似的应用程序
namespace DevelopmentApplications.MyDevelopmentApp
{
...
}
我知道这个领域会引起一些人的困惑,因为以下question 作者正在努力理解 Foo.Bar.Baz 和 Foo.Bar 之间的关系。还有一个 C# 开发人员进入 C++ 领域的逆向 question 提供了对该问题的一些见解。
我想另一种表述问题的方式是,在 C++ 中,使用 '::' 运算符来完全限定我知道的类型可以保证声明该类型的代码嵌套在某个命名空间层次结构的深处。但在 C# 中使用 '.'运算符要完全限定某些类型,该类型是否还必须存在于某些深度嵌套的命名空间层次结构中?我在这里假设 C# 使用像 A.B.C 这样的命名空间不一定需要 A B 和 C 之间的层次关系,或者 A B 或 C 甚至作为单独的命名空间存在。
如果有人能找到或知道有关此语法的相关语言规范,我很乐意阅读。
【问题讨论】:
-
为了避免过多的解释,您是否已经熟悉了这里的 C# 命名空间的背景? msdn.microsoft.com/en-us/library/z2kcy19k.aspx
-
你可以看到源代码,虽然referencesource.microsoft.com.
标签: c# c++ namespaces hierarchy layer