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

21

这两种表述有什么区别:

namespace Outer.Inner
{
}

而且

namespace Outer
{
    namespace Inner
    {
    }
}

在C#中?


根据我的经验,第一种选择更加简洁,可以消除多层嵌套。这对于其他人阅读你的代码非常有帮助,但同时也是代码自由的体现。要明智地使用。 - SnareChops
4个回答

14
假设您没有在Outer命名空间中放置任何其他声明或using指令,那么两者没有任何区别。 鉴于您很少会在单个文件中的多个命名空间中声明成员,我建议使用第一种形式 - 除此之外,它还可以节省一个缩进级别。请注意,“大括号位于新行的开头”是C#的更传统的括号风格:
namespace Outer.Inner
{
    ...
}

3
谢谢,我已经学习C++编程一段时间了,但我真的不喜欢在新行开头使用大括号,我不知道为什么,但这让我很难阅读代码! - user4099407
3
@paul: 虽然括号约定不像命名那样普遍,但我认为值得尝试沉浸在语言中最常见的约定中 - 你很快就会习惯它,然后你在网络上阅读的所有示例等都会更容易阅读...而且任何阅读你代码的人(来自C#背景)都会发现它更容易阅读。 - Jon Skeet
2
谢谢,我会从现在开始尝试这样做,不过我在这个网站上看到一些库使用了和我相同的大括号风格,但我想你是对的,感谢你的建议! - user4099407
1
@paul:里面有各种规定,我不敢推荐;) - Jon Skeet

9
没有任何区别,它们是相同的东西,不过第一个更常见。

7

不,但是第一种变体在c#代码中最常用。
第二种变体是你需要在C ++中编写的,我不确定我是否曾经在真正的c#代码中看到过它。


2
他们都与其他答案和文档这里所述相同。
此外,一个命名空间定义在另一个命名空间内并不意味着它与父命名空间有任何特殊关系,也不意味着它带来任何与父命名空间相关的特殊功能或依赖关系。除了在父级中定义(使用using语句引入),没有任何关系。
因此,重要的是要注意,如果您包含父命名空间,这并不意味着子名称现在可访问。请参见这个回答,其中对此进行了解释。
因此,尽管它们是嵌套的,但从实际目的来看,每个命名空间都是独立的东西,无论是最顶层的父级还是子级。如果要包括它,您将始终需要使用嵌套命名空间的完全限定名称。
因此,点(.)几乎成为命名空间的一部分,就像您可以将gmail id设置为first.last@gmail.com一样。 那么为什么要嵌套?

这只是为了逻辑上将它们放置在层次结构中以方便组织,但您可以将名称中的点看作命名空间的一部分(对于所有实际用途而言)。

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

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;

因此,尽管上述三行包含嵌套的命名空间,每一行实际上都是指向唯一命名空间的完全限定名称(好像点号是命名空间的一部分),这在区别和使用方面应该是有用的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接