没有。
我已经在小型项目和大型项目中尝试了这两种方法,并且都是由一个(我)和一个开发人员团队来完成的。
我发现最简单,最有效的方法是每个项目有一个名称空间,所有类都进入该名称空间。然后,您可以将类文件放到所需的任何项目文件夹中。始终在文件顶部添加using语句没有任何麻烦,因为只有一个名称空间。
将源文件组织到文件夹中很重要,我认为应使用所有文件夹。不需要这些文件夹也映射到名称空间是不必要的,需要做更多的工作,而且我发现这实际上对组织有害,因为增加的负担鼓励混乱。
以以下FxCop警告为例:
CA1020:避免名称空间类型少的
原因:全局名称空间以外的名称空间包含的类型少于五种
https://msdn.microsoft.com/en-gb/library/ms182130.aspx
此警告鼓励将新文件转储到通用的Project.General文件夹中,甚至转储到项目根目录中,直到您有四个类似的类来证明创建新文件夹的合理性为止。那会发生吗?
查找文件
公认的答案是:“这些班级将更容易找到,仅凭这些就足够了。”
我怀疑答案是指项目中有多个名称空间,这些名称空间不映射到文件夹结构,而不是我建议的是具有单个名称空间的项目。
在任何情况下,虽然无法从名称空间确定类文件所在的文件夹,都可以使用“转到定义”或Visual Studio中的搜索解决方案资源管理器框找到它。我认为这也不是什么大问题。在寻找文件以证明对其进行优化的问题上,我什至没有花费我的开发时间的0.1%。
名称冲突
确保创建多个名称空间可以使项目具有两个具有相同名称的类。但这真的是一件好事吗?禁止这种可能性可能更容易吗?允许两个具有相同名称的类会创建一个更复杂的情况,其中90%的情况下事物以某种方式工作,然后突然发现您有一个特殊情况。假设您在单独的命名空间中定义了两个Rectangle类:
- 类Project1.Image.Rectangle
- 类Project1.Window.Rectangle
可能会遇到一个问题,即源文件需要同时包含两个名称空间。现在,您必须在该文件的所有位置写出完整的名称空间:
var rectangle = new Project1.Window.Rectangle();
或者用一些讨厌的using语句弄乱:
using Rectangle = Project1.Window.Rectangle;
在项目中只有一个名称空间时,您不得不提出不同的名称,而我想用更具描述性的名称命名,如下所示:
- 类Project1.ImageRectangle
- 类Project1.WindowRectangle
而且用法在每个地方都是相同的,当文件使用两种类型时,您不必处理特殊情况。
使用语句
using Project1.General;
using Project1.Image;
using Project1.Window;
using Project1.Window.Controls;
using Project1.Shapes;
using Project1.Input;
using Project1.Data;
与
using Project1;
无需在编写代码时始终添加名称空间的简便性。这不是真正花费的时间,而是必须要做的只是使用大量的using语句填充文件的流程中的中断-为什么?这值得么?
更改项目文件夹结构
如果将文件夹映射到名称空间,则项目文件夹路径将有效地硬编码到每个源文件中。这意味着项目中文件或文件夹的任何重命名或移动都需要更改实际的文件内容。该文件夹中文件的名称空间声明以及在引用该文件夹中的类的其他文件中使用语句。尽管更改本身对工具来说是微不足道的,但通常会导致大型提交,其中包括许多文件甚至其类都没有更改。
使用项目中的单个名称空间,您可以更改项目文件夹的结构,但是无需修改任何源文件本身。
Visual Studio会自动将新文件的名称空间映射到在其中创建的项目文件夹
不幸的是,但是我发现更正命名空间的麻烦少于处理它们的麻烦。另外,我已经习惯于复制粘贴现有文件,而不是使用Add-> New。
智能感知和对象浏览器
我认为在大型项目中使用多个名称空间的最大好处是,在查看任何在名称空间层次结构中显示类的工具中查看类时,都具有额外的组织性。甚至文档。显然,在项目中只有一个名称空间会导致所有类都显示在一个列表中,而不是分为几类。但是,就我个人而言,我从来没有因为缺少它而感到困惑或拖延,所以我发现它没有足够大的好处来证明多个名称空间的合理性。
尽管如果我正在编写一个大型的公共类库,那么我可能会在项目中使用多个名称空间,以使程序集在工具和文档中看起来很整洁。