C# 枚举命名约定-复数

C# 枚举命名约定-复数,c#,.net,enums,naming-conventions,plural,C#,.net,Enums,Naming Conventions,Plural,我问这个问题,尽管我读过类似的书,但并不完全是我想要的 我发现我倾向于用复数形式命名枚举,然后用单数形式“使用”,例如: public enum EntityTypes { Type1, Type2 } public class SomeClass { /* some codes */ public EntityTypes EntityType {get; set;} } 当然它是有效的,这是我的风格,但有人能发现这种惯例的潜在问题吗?我确实有一个“丑陋”的名字,

我问这个问题,尽管我读过类似的书,但并不完全是我想要的

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

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}
当然它是有效的,这是我的风格,但有人能发现这种惯例的潜在问题吗?我确实有一个“丑陋”的名字,上面写着“地位”:

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

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

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

问题的措辞:


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

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

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

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

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

Microsoft建议对
Enum
s使用单数,除非
Enum
表示位字段(也使用)。请参阅(Microsoft的子集)

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

public enum OrderStatus { Pending, Fulfilled, Error };

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


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

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;
与之相比:

Statuses myStatus = Statuses.Ready;

我发现单数形式在上下文中听起来更自然。我们一致认为,当声明枚举(发生在一个地方)时,我们认为“这是一组whatever”,但当在许多地方使用它时,我们可能认为“这是一个whatever”.

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

这种情况从来都不适用于复数

enum
显示某事物的属性。我将给出一个示例:

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}
您可以使用一种类型,但请尝试使用复数形式,而不是复数形式:

幽默.讽刺|幽默.讽刺

而不是

幽默{讽刺、讽刺}

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

在另一条线上,有人指出了我认为非常好的想法:


“我知道我的建议违背了.NET命名约定,但我个人认为enum前缀为'E',enum标志前缀为'F'(类似于我们将接口前缀为'I')。”

来得有点晚

你的问题和我问的问题之间有一个重要的区别

您将枚举定义从类中删除,这样可以使枚举和属性具有相同的名称:

public enum EntityType { 
  Type1, Type2 
} 

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

}
在本例中,我将遵循MS guidelins,并为枚举使用单数名称(标志的复数形式)。这可能是最简单的解决方案


我的问题(在中)是当枚举在类的作用域中定义时,会阻止使用完全以枚举命名的属性。

如果您试图编写以下简单但禁止的代码:

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

  • 这是为数不多的几个地方之一,我不同意这个约定,甚至反对它。TBH,我讨厌枚举的定义和它的实例可以有相同的名称。我用“enum”后缀我所有的枚举特别是因为它明确了在任何给定的用法中它的上下文是什么。在我看来,它使代码更具可读性

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

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

    对枚举声明使用复数的原因是(在声明时)我们用多个值声明它,所以复数似乎很好。。。 但我们忽略了一个事实,即声明时枚举指定了它可以拥有的值(来自给定的值集)。这并不意味着该枚举的实例将存储多个值。。。。。 当我们写作时: 枚举日{周一、周二、周三、周四、周五、周六、周日}; 由于提供了多个值,我们将其设为复数。。 但是,当使用(Days-day=Days.MON;)时,我们完全忽略了该枚举的实例应该只有一个值。。。。 因此,当我们写作时: 枚举日{周一、周二、周三、周四、周五、周六、周日}; 我们的意思是,有一个枚举可以有任何一天作为它的值,所以单数更合适。
    尽管(如上所述),要避免使用单数名称,需要使用任何类型的指示符,如DayEnum或EDay(我更喜欢第二个指示符)…

    True,我想我的方法是一种“快速且懒惰”的方法,可以避免在使用Enum时想到名称。为了支持您的答案:在MSDN上,在部分中“财产名称”:✓ 考虑给一个属性和它的类型相同的名字。例子:<代码>公共颜色颜色{GET {}}} {{}}} /代码>哈哈,程序员不总是语法上的/政治上正确的。在你的情况下,我很可能使用“幽默类型”。“。我猜是坏习惯。如果我想搜索所有有讽刺感或讽刺感的人,我会不会通过搜索r
    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }
    
    public enum PersonTypesEnum {
        smart,
        sad,
        funny,
        angry
    }
    
    
    public class Person {   
        public PersonTypesEnum PersonType {get; set;}
    }