枚举命名惯例 - 复数

时间:2009-09-10 15:04:36

标签: c# .net enums naming-conventions plural

我问这个问题尽管在C# naming convention for enum and matching property

上读过类似但不完全正确的内容

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

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;}

}

其他信息: 也许我的问题不够明确。在命名我定义的枚举类型的变量时,我经常要努力思考。我知道最佳实践,但它无助于简化命名这些变量的工作。

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

我的问题:任何人都可以找到上述惯例的潜在问题吗? 这不是最佳做法。

问题改述:

嗯,我想我应该这样问这个问题:有人能用一种很好的通用方法来命名枚举类型,这样在使用时,枚举“实例”的命名会非常简单吗?

10 个答案:

答案 0 :(得分:296)

Microsoft建议对Enum使用单数形式,除非Enum表示位字段(同样使用FlagsAttribute)。请参阅Enumeration Type Naming Conventions(Microsoft的Naming Guidelines的一部分)。

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

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; }
}

答案 1 :(得分:32)

我开始以复数形式命名枚举但后来改为单数。似乎在使用它们的背景下更有意义。

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;

比较:

Statuses myStatus = Statuses.Ready;

我发现单数形式在上下文中听起来更自然。我们一致同意,当宣布在一个地方发生的枚举时,我们正在思考“这是一群凡人”,但在使用它时,大概在许多地方,我们正在思考“这是一个什么”

答案 2 :(得分:22)

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

enum显示某事物的属性。我举个例子:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}

你可以有一种类型,但尝试用多种方式来考虑它,而不是复数:

Humour.Irony | Humour.Sarcasm

而不是

Humours { Irony, Sarcasm }

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

答案 3 :(得分:12)

一般来说,最佳实践建议是单数的,除了那些附加了[Flags]属性的枚举(因此可以包含位字段),它应该是复数。

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

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

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

答案 4 :(得分:10)

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

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


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

没有人会混淆枚举是什么以及它的实例是什么。

答案 5 :(得分:6)

最佳实践 - 使用单数。您有一个组成Enum的项目列表。当你说Versions.1_0时,使用列表中的项目听起来很奇怪。说Version.1_0更有意义,因为只有一个1_0版本。

答案 6 :(得分:4)

迟到了......

你的问题和you mention之间有一个重要的区别(我问过; - ):

您将枚举定义排除在类之外,这允许您为枚举和属性使用相同的名称:

public enum EntityType { 
  Type1, Type2 
} 

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

}

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

我的问题(在other question中)是在类的范围内定义枚举时,阻止使用在枚举之后命名的属性。

答案 7 :(得分:4)

如果您正在尝试编写这样简单但禁止的代码:

    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; }  
    }
    

答案 8 :(得分:0)

在另一个帖子C# naming convention for enum and matching property,有人指出我认为这是一个非常好的主意:

“我知道我的建议违反了.NET命名约定,但我个人使用'E'为enums添加前缀,并使用'F'为enum标记添加前缀(类似于我们如何使用'I'为Interfaces添加前缀)。”

答案 9 :(得分:0)

在枚举声明中使用复数的原因是(在声明时)我们用多个值声明它,所以复数似乎很好...... 但是我们忽略了一个事实,即 enum 在声明时指定了它可以具有的值(来自给定的值集)。这并不意味着该枚举的实例将存储多个值..... 当我们写: enum Days { MON, TUE, WED, THU, FRI, SAT, SUN}; 我们将其设为复数是因为提供了多个值。 但是,当使用 (Days day = Days.MON; ) 时,我们完全忽略了该枚举的实例应该具有单个值.... 所以当我们写: enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }; 我们的意思是有一个枚举可以将任何一天作为其值,因此单数更合适。 虽然(已经在上面描述过),要在不使用单数名称的情况下解决这个问题,可以使用任何类型的指标,例如 DayEnum 或 EDay(我更喜欢第二个)...