比较和对比C ++与C#命名空间层次结构

时间:2014-12-16 21:35:50

标签: c# c++ namespaces hierarchy layer

我知道C#支持命名空间嵌套,C ++也是如此,它们都允许代码看起来像这样......

namespace A {
    namespace B {
        ...
    }
}

来自C ++背景并潜入C#世界我一直在思考通过所有必须发布以利用.NET的使用指令来显示组件的分层嵌套,例如

using System.Collections;
using System.Collections.Generic;

我确信Microsoft打算并设计这些库在逻辑上是按层次结构组织的,但是在没有查看源代码的帮助下我无法验证System.Collections.Generic是否具有Generic作为集合的嵌套命名空间,但我认为它是,并且它是通过命名空间嵌套完成的,就像用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之间的关系。还有一个反向question的C#开发人员进入C ++领域,可以深入了解这个问题。

我想另一种说明问题的方法是在C ++中使用' ::'运算符以完全限定我知道的类型,保证声明类型的代码嵌套在某个命名空间层次结构的深处。但在C#中使用'。'运算符要完全限定某些类型必须在某些深层嵌套的命名空间层次结构中存在该类型吗?我在此假设C#使用像A.B.C这样的命名空间并不一定要求A B和C之间存在层次关系,或者A B或C甚至作为单独的命名空间存在。

如果有人能够找到或知道有关此语法的相关语言规范,我很乐意阅读它。

2 个答案:

答案 0 :(得分:5)

C#4.0规范的第9.2节规定:

  

namespace-declaration qualified-identifier 可能是a   单个标识符或由“。”分隔的标识符序列。   令牌。后一种形式允许程序定义嵌套的命名空间   没有词法嵌套几个名称空间声明。例如,

namespace N1.N2
{
  class A {}
  class B {}
}
     

在语义上等同于

namespace N1
{
  namespace N2
  {
      class A {}
      class B {}
  }
}

你说:

  

我在这里假设C#使用像A.B.C这样的命名空间并不一定需要A B和C之间的层次关系,或者A B或C甚至作为单独的命名空间存在。

这种假设是错误的。命名空间A.B.C必然涉及全局命名空间中的命名空间A,命名空间B中的命名空间A以及命名空间C中的命名空间B。 / p>

答案 1 :(得分:1)

C#中的一些facts about namespaces

  1. 他们是集体的。您可以在几个不同的源文件中声明命名空间,编译器会将它们全部视为相同的命名空间。

  2. 您可以将名称空间嵌套在彼此内部,但是在另一个源文件中简单地声明嵌套名称空间更为常见。

  3. 有一个global namespace,每个班级都可以访问global::