枚举命名惯例 - 复数

o.k*_*k.w 249 .net c# enums naming-conventions plural

我问这个问题,尽管在枚举和匹配属性的C#命名约定中读过类似但不完全正确的内容

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

public enum EntityTypes {
  Type1, Type2
}

public class SomeClass {
  /*
    some codes
  */

  public EntityTypes EntityType {get; set;}

}
Run Code Online (Sandbox Code Playgroud)

当然它有效,这是我的风格,但任何人都可以找到这种惯例的潜在问题吗?我确实有一个"丑陋"的命名与"状态"一词:

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

public class SomeClass {
  /*
    some codes
  */

  public OrderStatuses OrderStatus {get; set;}

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

问题改写:

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

jas*_*son 313

Microsoft建议使用singular for Enums,除非Enum表示位字段(也使用它FlagsAttribute).请参阅枚举类型命名约定(Microsoft的命名准则的子集).

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

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass { 
    public OrderStatus OrderStatus { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

要么

public enum OrderStatus { Pending, Fulfilled, Error };

public class SomeClass {
    public OrderStatus Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是一个正确的答案.这个指南用于.Net框架,例如枚举DayOfWeek和标记枚举RegexOptions. (17认同)
  • 这是链接到答案的Microsoft命名约定指南的[.Net 4.0版本的链接](http://msdn.microsoft.com/en-us/library/ms229040.aspx). (4认同)
  • 是的,这是推荐的做法,我欢迎。但是它没有回答我的问题。 (2认同)
  • @Thomas 我从来没有遇到过问题,我不明白为什么它不起作用——不要看到一个上下文,无论它是被引用的类型还是变量都会有歧义。即`OrderStatus == OrderStatus.Pending` 被识别为左侧的变量,然后是右侧的枚举 (2认同)

Bob*_*man 35

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

enum Status { Unknown = 0, Incomplete, Ready }

Status myStatus = Status.Ready;
Run Code Online (Sandbox Code Playgroud)

相比于:

Statuses myStatus = Statuses.Ready;
Run Code Online (Sandbox Code Playgroud)

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

  • 稍晚的反应(可能有点偏离主题)但是:我建议使用值"0"表示未知值,这样未初始化的变量默认为"未知". (6认同)

Kyl*_*ndo 24

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

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

enum Humour
{
  Irony,
  Sarcasm,
  Slapstick,
  Nothing
}
Run Code Online (Sandbox Code Playgroud)

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

Humour.Irony | Humour.Sarcasm

而不是

Humours { Irony, Sarcasm }

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

  • 哈哈,好吧,程序员并不总是语法/政治上正确.在你的情况下,我可能使用"HumourTypes".我猜是坏习惯. (4认同)

Cha*_*ana 13

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

阅读完编辑后的问题后,我觉得您可能认为属性名称或变量名称必须与枚举类型名称不同......它没有.以下是完美的......

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

  public class Order
  {
      private Status stat;
      public Status Status
      { 
         get { return stat; }
         set { stat = value; }
      }
  }
Run Code Online (Sandbox Code Playgroud)


Hea*_*her 8

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

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


public class Person {   
    public PersonTypesEnum PersonType {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

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

  • 来自 Microsoft 的设计准则:“不要在枚举类型名称中使用“Enum”后缀。” https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces (4认同)
  • 也许您错过了我所说的第一句话?在这里,让我为您复制并粘贴它:“这是我很少同意该约定的少数几个地方之一。” 然后,我继续解释原因。 (3认同)
  • 如果可能存在名称空间冲突,我认为添加“Enum”没有问题?这并不是说作者建议用它们的类型来后缀所有变量。作者还提供了更有力的理由,因为提供了理由,而 M$ 提供了零理由。 (3认同)
  • 在有一个类和枚举命名相同的名称之后,我来到这里寻找枚举命名约定-并希望有一个“东西”使其更明显。我在想给它加上“ E”(显然是枚举),就像我们给接口加上“ I”一样-但是我喜欢您的解决方案Heather!好东西!!! (2认同)
  • 我不会“千方百计”地违反准则。那太夸张了。我以一种特定的方式违反了指导原则,这一点得到了我所陈述的推理的支持。如果您想不同意,请列出您不同意的原因;您的夸张是不必要的,不会提高您的位置。 (2认同)

小智 7

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

    public class Person
    {
        public enum Gender
        {
            Male,
            Female
        }
        //Won't compile: auto-property has same name as enum
        public Gender Gender { get; set; }  
    }
Run Code Online (Sandbox Code Playgroud)

您的选择是:

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

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

    public class Characteristics
    {
        public enum Gender
        {
            Male,
            Female
        }
    }
    public class Person
    {
        public Characteristics.Gender Gender { get; set; }  
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 我不确定为什么这家伙会被低估。这种情况是合理的,而且远不是假设的。出于类似的原因,一个人会在C#中嵌套枚举类型,因为它可能会在Java中使用一个内部类...因为内部类型仅在外部使用,而在其他任何地方都使用,并且仅在外部而不是其他地方才有意义。由于编译器的限制,您必须选择上述解决方案之一。 (3认同)
  • 假设的情况并不是一个好的解决方案。如果这会引起麻烦,为什么首先使用嵌套的“枚举”然后将其嵌套在另一个类中呢? (2认同)
  • 另一个可能更好的选择是“ Serge-appTranslator”的答案。 (2认同)

Jer*_*ron 6

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


Ser*_*ier 5

来晚了...

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

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

public enum EntityType { 
  Type1, Type2 
} 

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

}
Run Code Online (Sandbox Code Playgroud)

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

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