C#中的枚举应该有自己的文件吗?

我有一个使用枚举的类,枚举目前在它自己的文件中,这似乎很浪费。

对于将枚举放置在使用它们的文件的命名空间中,一般的看法是什么?或者枚举真的应该存在于它自己的CS文件中吗?

编辑

我应该提到的是,虽然所讨论的类使用这些枚举,但外部调用方也使用这些枚举。换句话说,另一个类可以设置这些枚举。所以它们不会在类内部使用,否则这个问题将是显而易见的。

93202 次浏览

这完全是作风问题。我倾向于做的是在解决方案中有一个名为Enums.cs的文件,其中收集了枚举声明。

但是无论如何,它们通常都是通过F12键找到的。

这其实只是个人喜好的问题。

我更喜欢将每个枚举放在它自己的文件中(同样,对于每个接口、类和结构,无论多小)。当我来自另一个解决方案或者还没有对所讨论的类型的引用时,它使它们更容易找到。

在每个文件中放置单个类型还可以更容易地识别源代码控制系统中的更改,而不会产生差异。

我不会说“浪费”(一个额外的文件要花多少钱?),但它通常是不方便的。通常有一个类与枚举关联得最紧密,我将它们放在同一个文件中。

我喜欢有一个名为E的公共枚举文件,包含每个单独的枚举,然后任何枚举都可以用E访问。他们在一个地方管理。

一般来说,我更喜欢我的枚举与类在同一个文件中,它很可能是一个属性。例如,如果我有一个类Task,则枚举TaskStatus将位于同一文件中。

但是,如果我有更通用的枚举,那么我会根据上下文将它们保存在不同的文件中。

我认为这取决于枚举的范围。例如,如果枚举特定于一个类,例如用于避免魔法常量的情况,那么我会建议将其放在与类相同的文件中:

enum SearchType { Forward, Reverse }

如果枚举是通用的,并且可以由多个类在不同的场景中使用,那么我倾向于将它放在自己的文件中。例如,以下内容可用于多种用途:

enum Result { Success, Error }

我倾向于将枚举放在它们自己的文件中,原因很简单:与类和结构一样,如果要查找类型的定义,最好知道确切地在哪里查找:在同名的文件中。(公平地说,在VS中,您也可以始终使用“转到定义”。)

显然,它可能会失控。我工作的一位同事甚至为代表制作了单独的文件。

我主要将其放置在命名空间内部和类外部,以便可以轻松访问该命名空间中的其他类,如下所示。

namespace UserManagement
{
public enum UserStatus { Active, InActive }
class User
{
...
}
}

你要问自己的问题是:在C#中,有没有任何关于枚举类型的东西表明我应该将它与我创建的所有其他类型区别对待?

如果枚举是公共的,则应将其视为任何其他公共类型。如果它是私有的,则将其声明为使用它的类的嵌套成员。没有令人信服的理由将两个公共类型放在同一个文件中,仅仅因为其中一个是枚举。它是公共类型这一事实才是最重要的;类型的味道不会。

为枚举使用单独文件的一个优点是,您可以删除使用该枚举的原始类,并使用该枚举编写新类。

如果枚举独立于原始类,则将其放在单独的文件中会使将来的更改更容易。

将每个类型(类、结构、枚举)放在其自己的文件中的另一个优点是源代码控制。您可以轻松获得该类型的整个历史记录。

这取决于需要什么访问权限。

如果枚举仅由单个类使用,则可以在该类中声明它,因为您不需要在其他任何地方使用它。

对于由多个类使用或在公共API中使用的枚举,我将始终在适当的名称空间中将定义保存在其自己的文件中。找到这种方法要容易得多,并且该策略遵循每个文件一个对象的模式,这也适用于类和接口。

如果您使用的是Visual Studio的Usysware文件浏览器外接程序,则可以非常快速地在解决方案中找到具有特定名称的文件。想象一下,在一个巨大的解决方案中,寻找一个不在自己的文件中,而是隐藏在某个文件中的枚举。

对于小型解决方案,这并不重要,但对于大型解决方案,将类和枚举保存在它们自己的文件中变得更加重要。您可以快速找到它们,编辑它们,等等。我强烈建议将您的枚举放在它自己的文件中。

正如所说的..一个最终只有几KB的文件有多浪费?

如果在一个解决方案中有多个项目。然后更好地创建另一个项目Utilities。然后创建一个\Enumerations的文件夹,并创建一个嵌套static class。然后分配每个静态类,您将在其中创建与项目名称对应的枚举。例如,如果您有一个名为DatabaseReader和DatabaseUsers的项目,那么您可以将静态类命名为

public static class EnumUtility {
#region --Database Readers Enum
public static class EnumDBReader {
public enum Actions { Create, Retrieve, Update, Delete};
}
#endregion


#region --Database Users Enum
public static class EnumDBUsers {
public enum UserIdentity { user, admin };
}
#endregion


}

然后,可以在每个项目的整个解决方案中使用的整个枚举将在其上声明。使用#region来分隔每个关注点。通过这种方式,可以更容易地查找任何枚举

非常简单,分离文件的巨大优势。当任何对象位于其自己的MyObjectName.CS文件中时..您可以转到解决方案资源管理器并键入MyObjectName.CS,然后只显示1个文件。任何能让调试变得更好的东西都是好的。

类似注释的另一个优点是,如果您在所有文件(Ctrl+施夫特+F)中搜索一个名称,您可能会在同一文件中找到20个对该名称的引用。且找到名称将是不同对象的一部分。在“查找结果”窗口中,您所能看到的只有行号和文件名。您必须打开文件并滚动以确定找到的引用位于哪个对象中。

任何使调试更容易的东西,我都喜欢。