枚举命名约定-复数


267

我问了这个问题,尽管已经读过类似但不完全是我在C#命名约定中枚举和匹配属性所要的东西

我发现我倾向于将枚举命名为复数形式,然后将其“使用”为单数形式,例如:

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}

当然可以,这是我的风格,但是没有人能找到这种约定的潜在问题吗?我确实用“状态”一词来命名“丑陋”:

public enum OrderStatuses {
  Pending, Fulfilled, Error, Blah, Blah
}

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}

其他信息:也许我的问题还不够清楚。在命名我定义的枚举类型的变量时,我常常不得不认真思考。我知道最佳做法,但这无助于简化命名这些变量的工作。

我不可能将我的所有枚举属性(例如“ Status”)公开为“ MyStatus”。

我的问题:有人能发现上述我的约定有潜在问题吗?这与最佳实践无关。

问题改写:

好吧,我猜我应该这样问:有人可以提出一种通用的命名枚举类型的方法,以便在使用时,枚举“实例”的命名非常简单吗?


5
公共枚举OrderState ...-公共OrderState OrderStatus {get; 集;}
弗雷泽,

Answers:


333

微软建议对Enums 使用单数形式,除非Enum代表位字段(也使用FlagsAttribute)。请参阅枚举类型命名约定(Microsoft 命名准则的子集)。

为了回应您的澄清,以下任何一项都没有错:

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass { 
    public OrderStatus OrderStatus { get; set; }
}

要么

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass {
    public OrderStatus Status { get; set; }
}

20
是的,这是正确的答案。该准则在.Net Framework中使用,例如,枚举DayOfWeek和标记枚举RegexOptions。
亚历山大·兹维特鲍姆

1
是的,这是推荐的做法,我对此表示欢迎。但是它不能回答我的问题。
okw

1
@okw进一步详细说明,尽管看起来很丑陋,但是如果您需要标志枚举中的单个值,请对字段/属性/参数使用单数形式。如果您支持它设置了多个标志,请使用复数。如果您的枚举不是标志枚举,请在类型名称和字段/属性/参数中使用单数。
乔纳森·迪金森

4
这是答案中链接到.Net 4.0版本的Microsoft命名约定指南的链接。

1
@Thomas我从来没有遇到过问题,我看不出为什么它不起作用-看不到上下文,在上下文中它是否被引用是类型还是变量。即被OrderStatus == OrderStatus.Pending识别为左边的变量,然后是右边的枚举
James Hurley

39

我开始以复数形式命名枚举,但此后更改为单数。只是在使用它们的上下文中似乎更有意义。

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

相比于:

Statuses myStatus = Statuses.Ready;

我发现单数形式在上下文中听起来更自然。我们同意在声明枚举发生在一个地方时,我们是在考虑“这是一组东西”,但是在大概在很多地方使用它时,我们是在考虑“这是一个东西”。 。


6
稍晚一点的反应(也许有点离题),但是:我建议使用value 0作为未知值,这样默认情况下未初始化的变量是Unknown
SvenL

同意@SvenL。相应地更新了示例。
鲍勃·考夫曼

您是否会[Flags]在示例中确实添加属性?同时具有“未完成”和“就绪”状态的东西是没有意义的。如果有的话enum [Flags]Steps { First, Second, Third },您真的会命名您的变量completedStep吗?
白手

26

这种情况从不真正适用于复数。

一个enum显示的东西或其他的属性。我举一个例子:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

您可以使用一种类型,但请尝试使用多种而不是多种形式:

Humour.Irony | Humour.Sarcasm

而不是

Humours { Irony, Sarcasm }

你有幽默感,你没有幽默感。


5
哈哈,嗯,程序员在语法/政治上并不总是正确的。在您的情况下,我可能会使用“ HumourTypes”。我猜是坏习惯。
okw

如果我想搜索所有具有讽刺意味或具有讽刺意味的人,该怎么办?我不将Humours包含Humours.Irony | Huomours.Sarcasm?? 的实例传递给搜索例程吗?
查尔斯·布雷塔纳2014年

14

通常,最佳实践建议为单数形式,但具有[Flags]属性附加的枚举(因此可以包含位字段)应为复数。

阅读您编辑过的问题后,我觉得您可能会认为属性名称或变量名称必须与枚举类型名称不同...事实并非如此。以下内容非常好...

  public enum Status { New, Edited, Approved, Cancelled, Closed }

  public class Order
  {
      private Status stat;
      public Status Status
      { 
         get { return stat; }
         set { stat = value; }
      }
  }

没错,我想我的方法是一种“快速而懒惰”的方法,可以避免在使用枚举时考虑名称。
okw

1
为支持您的回答:在MSDN上,从“类型名称 ”的“属性名称”部分中:✓考虑为属性赋予与该类型相同的名称。示例: public Color Color { get {...} set {...} }
DavidRR

10

这是我反对公约足以反对它的为数不多的地方之一。TBH,我讨厌枚举的定义及其实例可以具有相同的名称。我将所有枚举都用“ Enum”后缀,这是因为它可以清楚地说明在任何给定用法中它的上下文是什么。IMO使得代码更具可读性。

public enum PersonTypesEnum {
    smart,
    sad,
    funny,
    angry
}


public class Person {   
    public PersonTypesEnum PersonType {get; set;}
}

没有人会混淆枚举是什么和实例是什么。


2
在有一个类和枚举命名相同的名称之后,我来到这里寻找枚举命名约定-并希望有一个“东西”使其更明显。我在想给它加上“ E”(显然对于枚举),就像我们给接口加上“ I”一样-但是我喜欢您的解决方案Heather!好一个!!!
斯科特,

1
从Microsoft的设计准则来看:“不要在枚举类型名称中使用“ Enum”后缀。” docs.microsoft.com/en-us/dotnet/standard/design-guidelines/...
Thoryn霍利

3
也许您错过了我所说的第一句话?在这里,让我为您复制并粘贴它:“这是我很少同意该约定的少数几个地方之一。” 然后,我继续解释原因。
希瑟

2
我不会“千方百计”地违反准则。那太夸张了。我以一种特定的方式违反了准则,这一点得到了我所陈述的推理的支持。如果您想不同意,请列出您不同意的理由;您的夸张是不必要的,不会提高您的位置。
希瑟

1
如果可能发生名称空间冲突,我认为添加Enum?没有问题。这似乎不是作者提议用其类型将所有变量后缀。考虑到提供了原因,作者还有一个更强的案例,而M $提供了零理由。
Jai Govindani

7

如果您试图编写简单却禁止的代码,例如:

    public class Person
    {
        public enum Gender
        {
            Male,
            Female
        }
        //Won't compile: auto-property has same name as enum
        public Gender Gender { get; set; }  
    }

您的选择是:

  1. 忽略MS建议,并在枚举名称上使用前缀或后缀:

    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
  2. 将枚举定义移到该类之外,最好移到另一个类。这是上述的简单解决方案:

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }

2
假设的情况并不是一个好的解决方案。enum如果这会引起麻烦,为什么要先使用嵌套,然后再将其嵌套在另一个类中?
Gert Arnold

1
对于Gender,将属性名称设置为Gender并将枚举名称设置为更为有意义Sex。所以isac.Gender = Sex.Male..
nawfal 2013年

3
我不知道为什么这个家伙被选票。这种情况是合理的,而且远不是假设的。出于类似的原因,一个人会在C#中嵌套枚举类型,因为它可能会在Java中使用一个内部类...因为内部类型仅在外部使用,而在其他地方使用,并且仅在外部上下文而不在其他地方使用。由于编译器的限制,您必须选择上述解决方案之一。
内森·皮特曼

您将不得不从某个地方设置它,通常是在类之外,或者在构造类时,在这种情况下,您需要在外部定义枚举,除非您希望发送Person.Gender.Male,Gender可能适用于更多不仅仅是人,我认为没有嵌套是最好的解决方案。
Jim Wolff 2013年

2
另一个可能更好的选择是“ Serge-appTranslator”的答案。
柯蒂斯·雅洛普

6

最佳做法-使用单数形式。您有组成枚举的项目列表。当您说时,使用列表中的项目听起来很奇怪Versions.1_0Version.1_0因为只有一个1_0版本,所以说起来更有意义。


5

来晚了...

您的问题与您提到的问题(我曾问过;-) 之间存在重要区别:

您将枚举定义放在类之外,这使您可以为枚举和属性使用相同的名称:

public enum EntityType { 
  Type1, Type2 
} 

public class SomeClass { 
  public EntityType EntityType {get; set;} // This is legal

}

在这种情况下,我将遵循MS指南,并为枚举使用单数名称(用于标记的复数)。这是最简单的解决方案。

我的问题(在另一个问题中)是何时在类的范围内定义枚举,从而阻止使用恰好以枚举命名的属性。


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.