C#中的枚举应该有自己的文件吗?[关闭]


178

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

关于将枚举放置在使用它们的文件的名称空间中的一般看法是什么?还是应该将枚举真正存在于自己的CS文件中?

编辑

我应该提到的是,尽管所讨论的类使用了这些枚举,但是外部调用者也是如此。换句话说,另一个类可以设置这些枚举。因此,它们不会在班级内部使用,否则此问题将变得毫无道理。


86
如果您使用幻数,则根本不会出现此问题。
MusiGenesis

7
这应该是社区Wiki吗?除了IDE功能外,没有正确的答案,也没有真正的技术考虑。
杰夫·斯坦恩

1
即使它们位于不同的文件中,它们仍可以位于同一命名空间中。如果您要问是否要创建.Enums命名空间和新文件的第二个问题,那么我通常会说不。但是,否则,您可能对名称空间的理解是错误的,应该阅读它们-(对他们来说不多,只是一种组织机制)
Jason Kleban 2010年

1
在自己的文件中声明枚举允许程序员使用命令窗口(> [枚举名称]的)轻松地找到枚举
Riju 2015年

Answers:


103

我不会说“浪费”(多余的文件要多少钱?),但这通常很不方便。通常,有一个类与枚举关系最密切,我将它们放在同一文件中。


7
浏览时会在目录中增加噪音,这就是我的意思。
Finglas 2010年

117
@Finglas-一个人的声音是另一个人的信号!
杰夫·斯坦恩

6
通常,有一个班级关系最密切。但是,如果这种变化发生了变化,那么如果有人一次决定对枚举进行依赖,那么该进行重构了。
布伦南教皇

2
如果枚举要在不同的类之间共享,则最好将其放在单独的文件中。
康拉德(Konrad)'18

76

这实际上只是一个偏好问题。

我更喜欢将每个枚举放在自己的文件中(无论每个接口,类和结构如何,无论大小如何)。当我来自其他解决方案或没有相关类型的引用时,这使他们更容易找到。

在每个文件中放置一种类型也可以更轻松地识别源代码管理系统中的更改而无需区别。


10
“在每个文件中放置一种类型也可以更容易地识别源代码控制系统中的更改而无需区别。” 担心差异不应构成您设计决策的基础。我什至会争辩说,任何不知道如何在源代码管理中正确比较文件的人根本就不会使用源代码管理。
丹·贝查德

59

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

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


4
我认为这可能是最好的选择,因为:1)仅是一个文件,而不是许多文件,可能会导致目录混乱2)清楚文件中包含的内容3)意味着您知道在哪里可以找到enum而不是它位于包含相关类的文件中,但不一定是唯一使用该类的类
dav_i 2012年

6
我绝对不喜欢这样。正如詹姆斯·柯伦(James Curran)的回答所说,枚举主要与阶级有关。当将它们全部放在一个全局文件中时,它们甚至不在主题可归属的目录(用于子命名空间)中。

3
是@DebugErr,我同意你的观点。自从2010年发布此答案以来,我已经在各种方法之间进行了更改,并且倾向于每种类型使用一个文件,或者在与相关类相同的文件中声明枚举。
FredrikMörk2014年

@Ray ...enums have a relation to classes mostly.。这是你让我迷路的地方。请举一个例子,说明如何处理与几个类有关系的枚举?
K-SO的毒性在增加。

@KarlMorrison请,那条评论有5岁了。无论如何,出于某种原因,我添加了“大部分”一词。枚举不仅与类有关系,还与名称空间类似。如果我在AnchorStyle整个UI库中都使用了一个枚举,则通常还需要一个UI子命名空间和相应的文件夹。然后,将其放置在AnchorStyle.cs可以轻松找到的UI文件夹中的文件中,而不是通常命名为“ Enums.cs”的文件中。

47

要问自己的问题是:关于C#中的枚举类型,是否有什么事情与我创建的所有其他类型有所不同?

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


如果要在同一企业项目的其他解决方案中重用枚举该怎么办?使用该类将枚举与类绑定将非常困难。
mko

@mko:项目参考已经意味着类和枚举将可用于其他解决方案。是什么使它变得困难?
布莱恩·瓦茨

可以,但是如果您只想使用枚举,那么您真的想与整个类共享其逻辑吗?此外,如果不同的类共享相同的枚举,该怎么办。你会放在哪里?
mko

@mko:有了项目参考,无论它们是否在不同的文件中,您都将获得这两种类型。我在弄清楚您的要求时遇到了麻烦。
布莱恩·瓦茨

好吧,我不是在谈论项目参考,而是。我正在谈论将枚举移动到共享项目文件,并能够在不暴露整个类的情况下在多个项目中重用它。您说:“没有令人信服的理由将两个公共类型放在同一个文件中仅仅是因为一个是枚举”。如果您按照我的解释,也许有理由将所有枚举都放在同一个文件中。
mko


18

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

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

哇。我不知道可以将枚举直接放入命名空间中。我要这个答案。在我的MVC结构中,它们将放置在控制器内部,这对我来说很逻辑。谢谢你 已投票。
C4d

11

通常,我希望枚举与Class放在同一个文件中,而Class很有可能是其属性。例如,如果我有一个类,Task那么枚举TaskStatus将在同一文件中。

但是,如果我的枚举具有更一般的性质,则可以根据上下文将它们保留在各种文件中。


如果不同的类也使用相同的枚举怎么办?
mko

2
@mko-这就是为什么我说(早在2010年,当我回答这个问题时)说,如果枚举具有更通用的性质,我会将它们保存在单独的文件中。在上下文中,我的意思是在某些情况下某些枚举可能位于单独的文件中,而在其他情况下,我可能会将一组枚举声明分组在单个文件中。
Nikos Steiakakis

10

这取决于所需的访问权限。

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

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


8

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

enum SearchType { Forward, Reverse }

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

enum Result { Success, Error }

6

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

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


6

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

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


6

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

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

并且如前所述...一个文件最终只剩下几个kb是多么浪费?


我也使用该加载项,非常方便。无论解决方案大小,我都会将枚举放入自己的文件中。
Rui Jarimba

5

分离文件非常简单的巨大优势。当任何对象位于其自己的MyObjectName.cs文件中时,您可以转到解决方案资源管理器并键入MyObjectName.cs并显示为正好1个文件。任何使调试更好的方法都很好。

类似的注释的另一个优点是,如果您在所有文件(ctrl+ shft+ F)中搜索名称,则可能会在同一文件中找到20个对该名称的引用...并且找到的名称将是不同对象的一部分。在“查找结果”窗口中,您只能看到行号和文件名。您将不得不打开文件并滚动以找出找到的引用所在的对象。

我喜欢使调试更容易的任何事情。


2

一个解决方案中有多个项目。然后更好地创建另一个项目Utilities。然后创建一个Folder \Enumerations并创建一个nested 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分隔每个关注点。这样,查找任何枚举会更容易


1

我喜欢有一个名为E的公共枚举文件,其中包含每个单独的枚举,然后可以使用E ...来访问任何枚举,并且它们都在一个位置进行管理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.