common knowledge(and convention)命名空间用于唯一标识代码并防止名称冲突,这就是为什么您应该始终将自己的代码放在一个唯一的命名空间尽可能。
但,...
命名空间还用于将逻辑上相关的类组合在一起。我的个人库只是在Framework类库(FCL)上扩展,并实现了我在FCL中找不到的所有功能。它主要包含扩展和辅助类,以及其他高度可重用的类。我发现遵循与FCL中相同的命名空间结构非常有用。
我更进一步,并开始使用FCL的命名空间将我的代码“注入”我真正期望的名称空间。
一个优点是您不必定义任意数量的使用。例如。通过简单地引用库,可以立即使用扩展方法,而无需添加额外的使用。作为一个很好的例子(对于那些喜欢保持其使用列表清洁的人),您经常期望扩展方法有效,只是意识到您没有添加“使用System.Linq;”了吗?
更新:
因此,我相信的主要优势(如评论中所述)是您可以更轻松地访问更多实用程序,而无需查找特定的命名空间。例如。如果您使用System.Collections.Generic
,则可以立即使用IList<T>
的扩展方法。
我认为这种优势实际上可能超过劣势。我不会为将来可能发生名称冲突而烦恼,因为这表明FCL的新版本实际上包含了我想要的类似内容。它实际上更容易注意到FCL中的更改,无论如何我想在命名空间中反映出来。
当然,我知道如果每个人都开始为公共图书馆这样做,那将会出现根本错误,但对于我个人的项目,我觉得它真的很有用。
我是否忽略了任何其他缺点?我已经考虑过如果我想公开图书馆,我需要找到一种方法来允许使用{{ 1}}命名空间,或用户期望的不同命名空间。我知道在.NET环境中执行此操作的唯一方法是using predirectives。
更新2 :
所以,就像我说的那样,我确实意识到有些人可能会发现它不方便并希望有一个不同的命名空间。对于我自己的项目,我觉得做起来很不方便。以下内容:
System
更不用提this problem using System.Windows;
using System.Windows.Controls;
using System.Windows.Media
using System.Windows.Media.Media3D;
using MyNamespace.Windows;
using MyNamespace.Windows.Controls;
using MyNamespace.Windows.Media;
using MyNamespace.Windows.Media.Media3D;
不可能。
要表达一个有希望产生更多有用答案的问题:
有没有一种解决方案可以更好地解决这个问题,而不是将代码放在系统命名空间中?有没有办法在需要时轻松编译到不同的命名空间除了使用预定之外,还是一个坏主意?
答案 0 :(得分:5)
忽略命名冲突,因为您链接到已经...
这有一个主要优点,您无需定义任意数量的使用。
我实际上认为这是一个缺点。强制您添加using语句或完全限定您的类型使您的代码更易于维护,因为它使定义特定代码的位置更加明显。
虽然在System.***
命名空间中查看实用程序可能没什么问题,但大多数开发人员都希望定义为System.***.SomeType
的类型是基类库的一部分。在我看来,用你自己的类型“扩展”基础库会引起混淆,并导致可维护性降低。
答案 1 :(得分:0)
我将发布Cody Gray的评论,这对我的回答最为有帮助:
为什么你需要分开所有 你的“助手”功能分开了 命名空间首先?那 是的,为什么他们不能称之为 MyNamespace,只留下一个 使用指令添加?唯一的 原因命名空间在这里很有用 尽量减少碰撞;这是值得怀疑的 你的扩展方法将有 相同的名字(如果他们这样做,你就不会 能够同时导入它们 无论如何,你已经表现出来了。)