【代码示例】
在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不是更方便吗?
根据 C#语言规范中关于命名空间的定义,命名空间的主要作用是用于类型的组织管理。
而using namespace 指令只是导入命名空间中包含的类型,并不包含嵌套的命名空间。
在相同的namespace下可以使用嵌套命名空间的直接使用,例如在 namespace A 下可以 直接 B.x。
使用using指令只是导入指定namespace的类型,而非展开整个命名空间。
允许的话,会造成一定的混乱,在namespace B下如果直接导入namespace A下的所有,那么 (A.)B 和 B就会发生冲突,而且这种冲突是自动引入的,using A 后就产生了。
如果类型之前出现冲突,使用完全限定名解决,但是这里命名空间出现了冲突的话,就很难处理了。