如何组织C#类

20

在C#中,有没有一般性的做法来组织你的类?每个 .cs 文件中应该只有一个通用类吗?我看到我有一个名为 Form1.cs 的文件,其中包括所有与 "Form1" 相关的类。但是我可以创建一个名为 Misc.cs 的文件,其中包括所有杂项类。不确定哪个方法能让所有内容保持有序。

或者我应该按特定方式进行组织?例如,我正在访问一个 MySQL 数据库,所以我正在创建一个 MySQL wrapper ,我将其存储在 MysqlWrapper.cs 中,并给它命名相应的类名。我应该为我创建的每个类都创建一个新的 .cs 文件吗?还是只组合那些使用相似 "using" 命名空间的类,例如 System.Text; using System.Windows.Forms; 等等?

10个回答

21

编辑 - 这个答案是为了补充其他人已经发布的好答案。

其他人似乎在回答具体问题。我认为你会有更多的“最佳实践”设计问题。

官方指南可以在这里找到:http://msdn.microsoft.com/en-us/library/czefa0ke(VS.71).aspx

特别是要深入研究命名指南,然后是名称空间命名指南和类命名指南。

还有,正如其他人提到的,请每个文件一个类。这将使后续开发人员更容易进行维护。


类库设计指南仅指定API指南,但实际上并未指定文件组织指南。 - Reed Copsey
1
它们都是关于如何设计您的API,但完全忽略私有的实现细节(包括文件结构)。 - Reed Copsey
是的,我应该明确表明我的回答是为了补充这里已经有的其他好的答案。 - David

14
通常,我会为每个类创建单独的 .cs 文件。此外,我会将文件组织成与类命名空间相匹配的形式。
随着项目规模的增大,这样做可以简化组织工作,因为您始终知道在项目中哪里可以找到一个类。当有更多人一起开发解决方案时,这变得更加重要。每个文件只包含一个类也有益处,因为文件夹结构可以让您了解命名空间的复杂性程度,看到是否需要拆分命名空间以避免过于复杂。

我看到有一个 Form1.cs 文件,其中包括所有与“Form1”相关的类。

与其这样组织,我建议将它们分别放在不同的文件中。如果您有很多与某个特定操作(由或通过 Form1 执行)相关的类,我建议将它们放在自己的命名空间中。我还强烈建议将“Form1”重命名为更有意义的名称,例如“EmployeeForm”。这将使您更容易理解和维护代码。


1
我会为非常小的类型打破规则。例如,我经常创建一个“Enums.class”,其中包含多个枚举类型。 - Brian S
1
@Brian S:我以前也是这样做的,但现在我正在管理一个规模更大的项目,有多个开发人员在多个地点工作,我会为每种类型创建一个单独的文件,包括简单的枚举。话虽如此,我认为拥有“enums.cs”等文件并没有什么问题,但我发现将它们分开可以节省我很多麻烦。 - Reed Copsey
3
就我个人而言,我认为API变化越多,分离的重要性就越大。当你在一个文件中有5个枚举时,很容易出现重构工作遗留下潜在未使用的枚举等问题... - Reed Copsey
1
我同意你关于按命名空间来组织类的说法,实际上,Visual Studio会为你提供帮助--如果你在解决方案资源管理器中创建了一个项目下的文件夹,并且在该文件夹中添加了一个新的类,注意到VS会自动将文件夹名包含在你的命名空间中(它变成了“yourdefaultnamespace. YourFolderName”)。 - JMarsch

4

一般情况下,每个文件只包含一个类。有些类使用“partial”关键字分散在多个文件中。我的文件夹结构大致匹配命名空间结构。


在C#中,命名空间会自动附加文件夹的名称。 - Steven Sudit
5
@Steven的意思是,“在Visual Studio中”,而不是“在C#中”。 - Travis Heseman
我不确定。上次我使用VC++时,好像没有命名空间/文件夹功能,但那只是一个小项目。至于VB,我尽量避免使用,所以无法确定。我也没有做过足够多的F#来了解。但如果你说这是VS的功能,那就可以了。 - Steven Sudit
VS会根据目录结构初始化命名空间,但您可以随时更改它。 - onof
在VS中,如果项目是Web应用程序项目,根据我的理解,命名空间的组织方式就是按照目录结构来进行的。 - GibboK

2

我不严格遵循一个文件一个类的规则。如果我正在处理一个非常大的类,其中有很多代码,我可能会给它自己的文件。然而,通常情况下,只要多个类在逻辑上相关,我就没有问题将它们放在同一个文件中。这通常适用于小类,但对于大类来说可能不是最佳选择。


2

我可能因为这么说而受到责备,但至少在Visual Studio中,这可能不像以前那样重要了。

我的大多数文件只有一个类,但对于一些琐碎的枚举和仅被另一个类使用的简单存储类,我会将它们放在与主类相同的文件中。否则,如果我想在其他地方使用相同的类,我就需要移动多个文件并猜测我需要哪些文件。

您可以右键单击标识符并单击“转到定义”来导航到它,您可以按ctrl+逗号进行搜索,或者您可以使用“类视图”。

我会将相关的.cs文件分组到文件夹中--这种更大的图片似乎更重要。我还确保文件夹名称始终与命名空间匹配,即我将Visual Studio在创建新类文件时提供的默认命名空间保存在文件夹中。


1
是的,我同意VS 2010的新功能和Pro Power Tools扩展程序。重要的不是你如何物理地组织文件,而是你的类的面向对象架构。 - iLemming

1
通常情况下,如果你每个文件只有一个类型(类/结构体/枚举),那么你的代码更易于维护(其他人更容易阅读)。
然而,在使用部分类时,我有时会根据主要功能区域将大型类分成多个文件。如果一个类有私有嵌套类型,我几乎总是将这些嵌套类型放在单独的文件中。

如果你能够将一个类分解成功能上独立的部分,那么很有可能你应该将这个类重构为多个独立的类。 - Dave Cousineau

1
我通常每个文件都只有一个类。唯一的例外可能是如果一个类有一个私有嵌套类,我通常会将其保留在同一个文件中,而不是使用partial关键字将其拆分到另一个文件中。 这样我觉得定位起来更容易。

1
只需要遵循几个原则:
可维护性:项目应该易于更新和修复错误。问题:查找给定的类/函数需要很长时间吗?如果有错误,是否可能发生在程序员(不一定是编写者)会查看的地方?
复杂性:程序应该清晰明了。有时将其拆分可以帮助理解,有时将其保持在一起可以帮助理解。问题:当别人查看它时,他们会感到困惑吗?他们会想知道所有部分的作用吗?
这实际上只是常识。此外,请注意,某些IDE工具将允许您保持混乱状态并仍然能够找到东西(例如引用查找器)。您必须决定可接受的混乱程度以及何时进行重构。

0

我有时也会将类似的类文件合并到VS的一个分支中。

例如 - 如果您有3个文件: Message.xaml, Message.xaml.cs, MessageButton.cs, MessageImage.cs, MessageResult.cs。

Message.xaml.cs已经显示在第一个文件的层次结构中。您还可以通过使用记事本编辑项目文件来添加其他文件。您只需要添加

   <DependentUpon> </DependentUpon>

需要在需要的地方使用

标签。

我不知道是否有任何扩展可以更轻松地完成这项工作。
还有一件事。虽然这将帮助您组织项目中的文件,但您无法通过在VS中双击文件名来简单地重命名类。

0

在一个文件中不应该组合使用相似的“using”命名空间的类,因为如果你必须更改一个类的实现,你就必须将类移动到其他文件中。

我每个类保持一个文件,因为这对源代码控制系统非常有用。此外,我尽可能避免使用部分类。如果一个类太大,那么设计上肯定有问题。


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