C#中,使用多层namespace的疑问

【代码示例】

在C#中,定义2个class

  • 一个在namespace A中
  • 另一个在namespace A.B中
namespace A
{
    class ClassInA
    {

    }
}

namespace A
{
    namespace B
    {
        class ClassInAdotB
        {

        }
    }
}

然后,使用这两个class

using System;
using A;

namespace Test
{
    public class Test
    {
        public static void Main()
        {
            ClassInA a = new ClassInA();
            A.B.ClassInAdotB ab1 = new A.B.ClassInAdotB();  //✔ 可以这么写
            B.ClassInAdotB ab2 = new B.ClassInAdotB();    //✖ 不能这么写
        }

    }
}

【我的疑问】

在C#中,如果有一个namespace A,还有一个两层的namespace A.B。
之后,using A;

这时,如果要使用 namespace A.B 中的东西。
还必须通过 A.B.x 来调用,不能通过 B.x 来调用。

C# 为何这么设计?允许B.x不是更方便吗?

阅读 4.9k
3 个回答

根据 C#语言规范中关于命名空间的定义,命名空间的主要作用是用于类型的组织管理。

using namespace 指令只是导入命名空间中包含的类型,并不包含嵌套的命名空间。

在相同的namespace下可以使用嵌套命名空间的直接使用,例如在 namespace A 下可以 直接 B.x。
使用using指令只是导入指定namespace的类型,而非展开整个命名空间。
允许的话,会造成一定的混乱,在namespace B下如果直接导入namespace A下的所有,那么 (A.)B 和 B就会发生冲突,而且这种冲突是自动引入的,using A 后就产生了。
如果类型之前出现冲突,使用完全限定名解决,但是这里命名空间出现了冲突的话,就很难处理了。

using A; 只导入 A 命名空间下面的,并不包含 A.XA.X.YA.X.Y.... 等命名空间。

假设这样定义TestA和TestB
image.png

你以为它们是嵌套的关系,其实不是。

反编译看下
image.png

TestA和TestB属于不同的命名空间,不存在上下级关系。

另外,这种嵌套命名空间的写法也是不推荐的。