命名空间点命名空间和嵌套命名空间有什么区别?

时间:2014-10-01 20:08:55

标签: c# namespaces

之间有什么区别:

namespace Outer.Inner
{
}

namespace Outer
{
    namespace Inner
    {
    }
}
在C#中

4 个答案:

答案 0 :(得分:12)

假设您没有在using命名空间中放置任何其他声明或Outer指令,则完全没有区别。

鉴于您非常非常很少在单个文件中声明多个名称空间中的成员,我建议使用第一种形式 - 除了其他任何内容之外,它还会保留一定程度的缩进。请注意,“在新行的开头处括号”是C#的更传统的支撑方式,但是:

namespace Outer.Inner
{
    ...
}

答案 1 :(得分:5)

不,但第一个变体是c#代码中使用最多的 第二个变体是你必须用C ++编写的,我不确定我是否曾在真正的c#代码中看到它。

答案 2 :(得分:5)

没有任何区别,这些是相同的,但第一个更常见。

答案 3 :(得分:0)

它们与其他答案和每个文档here所说明的相同。

一个名称空间是在另一个名称空间内定义的事实并不意味着它与父名称空间有任何特殊关系,也没有带来任何与父名称空间相关的特定功能,或者它取决于父名称空间。除了只是在父级内部定义(在using语句的上下文中将它们引入)之外,没有其他关系。

因此,请务必注意,如果包括父名称空间,并不意味着现在可以访问子名称。请参阅this答案,此内容对此进行了解释。

因此,尽管实际上它们是嵌套的,但从实际上所有目的来看,每个命名空间都是其自己的独立对象,无论其父级或子级是最高的。如果要包含嵌套名称空间,则always需要使用完全限定名称。

因此,dot(。)几乎成为命名空间的一部分,就像您可以将first.last@gmail.com的gmail ID用作

那为什么要嵌套?

出于逻辑上的考虑,实际上只是将它们逻辑地放在一个层次结构中,但是您可以将名称中的点视为命名空间的一部分(对于所有实际用途)。

例如,您可以定义以下内容:

namespace Outer.Inner
{
   class MyClass{}
}

但是,如果您愿意,可以出于所有实际目的将以上名称重命名为以下内​​容:

namespace Solar
{
   class MyClass{}
}

在两种情况下,如果您想使用MyClass,都需要包括定义类的名称空间的全限定名称,即:

using Outer.Inner;

using Solar;

在查看C#库名称空间时,可以最好地理解和总结这一点。

using System;
using System.Threading;
using System.Threading.Tasks;

因此,尽管上述三行包含嵌套的名称空间,但每一行实际上都是唯一名称空间的完全限定名称(就像点是名称空间的一部分一样),这对于了解它们的区别和用法应该很有用。