题 C#命名空间和程序集最佳实践


C#:在将解决方案划分为名称空间和程序集时,是否有任何指导方针和最佳实践?名称空间通常应该嵌套,顶层名称空间中的最低级别和基础类是什么?一般会有一个名称空间到一个程序集吗?在一个名称空间中有多个程序集或在一个程序集中有多个名称空间是他们的任何陷阱。多个组件或非常大的组件是否有编译时间/运行时间的惩罚?


22
2018-01-19 22:54


起源


我见过很多团队使用基于项目名称和目录的命名空间,Resharper'强调'开箱即用。 IMO,他们有点矫枉过正,只需要很多“使用”垃圾。如果VS / Resharper没有强迫我遵守,我最多可能每个项目/模块一个。 - kenny
@kenny - 如果您不想在命名空间中使用该文件夹名称,则ReSharper允许您将Folder Properties中的Namespace Provider设置为False。但这是一个按用户设置,主要似乎影响模板的添加/新建。 - TrueWill
看到 框架设计指南 一些最佳实践。 - TrueWill
谢谢@TrueWill我只是懒惰;( - kenny
然后尝试阅读 命名空间的名称 相反,MSDN上的页面。 - Brian


答案:


C#:在将解决方案划分为名称空间和程序集时,是否有任何指导方针和最佳实践?

有关命名空间的指南,请阅读框架设计指南。

对于程序集:根据定义,程序集是.NET中自描述可自由发送功能的最小独立可版本单元。您打算发布的软件部分是否相互独立?然后他们应该在不同的集会。

名称空间通常应该嵌套,顶层名称空间中的最低级别和基础类是什么?

不一定,没有。

应该设计命名空间,以便用户可以轻松发现和理解这些命名空间中包含的类型。也许你应该问你的用户他们的想法。

一般会有一个名称空间到一个程序集吗?

不一定,没有。

在一个名称空间中有多个程序集或在一个程序集中有多个名称空间是他们的任何陷阱。

不是特别,不。

多个组件或非常大的组件是否有编译时间/运行时间的惩罚?

不是我知道的。


24
2018-01-19 23:22



+1但FWIW Performance如果您的入口点程序集包含必须加载的30个依赖程序集的列表,则可能是一个杀手。此外,StyleCop的规则在一个程序集中涉及太多类型。 - doogle
它们是否动态加载会有什么不同吗? - Rich Oliver
有用!谢谢! - jazzBox


跟进Eric Lippert所说的话:

装配名称

对于程序集中的几乎所有代码来说,传统上都存在于单个命名空间和子命名空间中,而程序集以命名空间命名。

例如,如果给我一个带文件名的程序集 Contoso.PartnerPortal.Services.dll,大会的简称传统上是 Contoso.PartnerPortal.Services,我希望大部分代码能够存在于 Contoso.PartnerPortal.Services 命名空间(和子命名空间)。

然而,不是所有的课程 Contoso.PartnerPortal.Services 命名空间必然存在于Contoso.PartnerPortal.Services.dll程序集中。如果一个 Contoso.PartnerPortal.dll 汇编存在它可能有一些类 Contoso.PartnerPortal.Services 命名空间。

这种情况的一个常见用途是使用接口。如果接口存在 Contoso.PartnerPortal.dll 那么该程序集中的代码可以使用该接口而无需引用 Contoso.PartnerPortal.Services.dll。这很重要,因为 Contoso.PartnerPortal.Services.dll (将实现接口)可能需要参考 Contoso.PartnerPortal.dll 最好避免使用圆形装配参考。

装配的数量/尺寸

过大的程序集可能会使编译时间超过必要的时间。这是因为编译器在相当长的时间内没有支持增量编译。因此,必须将整个模块编译为一个单元。由于多模块程序集不经常使用,这基本上意味着您必须一次编译整个程序集。

如果将大型装配拆分为几个较小的装配,则仅重新编译已更改的装配和引用的装配。这节省了一些时间。

另一方面,在一个应用程序中有超过600个程序集(我在日常工作中处理这样的怪物)有其自身的一系列问题。例如,ASP.net的卷影复制功能在使用许多程序集时遇到了性能问题(请记住,除了ASP.net编译aspx和ascx文件时创建的大量程序集之外)。


13
2018-01-20 22:20





命名空间只是为了方便用户而拆分完整类名的奇特方式。因此,使用命名空间没有编译/运行时惩罚或收益。

将对象拆分为程序集会对运行时和编译时产生影响,如果不使用大量的程序集,也不会很高。请注意,如果没有针对您的特定情况进行实际测量,则无法预测您获得的收益或缓慢程度。

您应该根据您的逻辑(即子系统)/技术(即由于组件版本控制)需要将项目划分为程序集,并验证性能是否可接受。如果没有,你需要在将它归咎于组件数量之前找出问题所在。


6
2018-01-19 23:08