首页 文章

枚举命名惯例 - 复数

提问于
浏览
207

我问这个问题,尽管我已经阅读了相似但不完全正确的内容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” .

我的问题:任何人都可以找到上述惯例的潜在问题吗? It is NOT about best practice.

Question rephrase:

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

9 回答

  • 4

    通常,最佳实践建议是单数的,除了那些附加[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

    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

    我开始用复数命名枚举,但后来改为单数 . 在他们使用的地方似乎更有意义 .

    enum Status { Unknown = 0, Incomplete, Ready }
    
    Status myStatus = Status.Ready;
    

    相比于:

    Statuses myStatus = Statuses.Ready;
    

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

  • 21

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

    enum 显示某个或另一个的属性 . 我举个例子:

    enum Humour
    {
      Irony,
      Sarcasm,
      Slapstick,
      Nothing
    }
    

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

    Humour.Irony | Humour.Sarcasm

    而不是

    Humours { Irony, Sarcasm }

    你有幽默感,没有幽默感 .

  • 10

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

    public enum PersonTypesEnum {
        smart,
        sad,
        funny,
        angry
    }
    
    
    public class Person {   
        public PersonTypesEnum PersonType {get; set;}
    }
    

    没有人会混淆什么是枚举,它的实例是什么 .

  • 31

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

  • 8

    来得有点晚了......

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

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

    public enum EntityType { 
      Type1, Type2 
    } 
    
    public class SomeClass { 
      public EntityType EntityType {get; set;} // This is legal
    
    }
    

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

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

  • 275

    如果您正在尝试编写简单但禁止的代码,请执行以下操作:

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

    你的选择是:

    • 忽略MS建议并在枚举名称上使用前缀或后缀:
    public class Person
    {
        public enum GenderEnum
        {
            Male,
            Female
        }
        public GenderEnum Gender { get; set; }
    }
    
    • 将枚举定义移到类外,最好移到另一个类中 . 以上是一个简单的解决方案:
    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }
    
  • 6

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

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

相关问题