Enum命名约定-复数

我问这个问题,尽管读过类似的,但不完全是我想要的枚举和匹配属性的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;}


}
< p >额外的信息: 也许我的问题还不够清楚。在为我所定义的枚举类型的变量命名时,我经常需要认真思考。我知道最佳实践,但这无助于减轻我命名这些变量的工作

我不能暴露我所有的枚举属性(说“状态”)为“MyStatus”。

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

问题改述:

好吧,我想我应该这样问这个问题:有人能想出一个很好的通用方式命名枚举类型,这样在使用时,命名枚举“实例”将非常直接?

211337 次浏览

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

在阅读了你编辑的问题后,我有一种感觉,你可能认为属性名或变量名必须与枚举类型名不同……它不是。下面的内容完全没问题……

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


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

微软建议Enum使用单数,除非Enum表示位字段(也可以使用FlagsAttribute)。参见枚举类型命名约定(微软命名原则的子集)。

就你的澄清,我认为以下任何一条都没有问题:

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

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

enum Status { Unknown = 0, Incomplete, Ready }


Status myStatus = Status.Ready;

比较:

Statuses myStatus = Statuses.Ready;

我发现单数形式在语境中听起来更自然。我们一致认为,在声明枚举时,它发生在一个地方,我们认为“这是一组任何东西”,但当在许多地方使用它时,我们认为“这是一个任何东西”。

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

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

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

enum Humour
{
Irony,
Sarcasm,
Slapstick,
Nothing
}

你可以有一种类型,但试着用复数来思考,而不是复数:

Humour.Irony | Humour.Sarcasm

而不是

Humours { Irony, Sarcasm }

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

在另一个线程枚举和匹配属性的c#命名约定中,有人指出了一个我认为非常好的想法:

“我知道我的建议违背了。net命名惯例,但我个人认为枚举前缀为'E',枚举标志前缀为'F'(类似于我们为接口前缀为'I')。”

来晚了一点……

你的问题和你提到(我问的是;-)之间有一个重要的区别:

将枚举定义放在类外,这允许枚举和属性具有相同的名称:

public enum EntityType {
Type1, Type2
}


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


}

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

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

如果你想写一些直截了当的,但被禁止的代码,像这样:

    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的建议,在enum名称上使用前缀或后缀:

    public class Person
    {
    public enum GenderEnum
    {
    Male,
    Female
    }
    public GenderEnum Gender { get; set; }
    }
    
  2. Move the enum definition outside the class, preferably into another class. Here is an easy solution to the above:

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

没有人会混淆什么是enum,什么是它的实例。

在枚举声明中使用复数的原因是(在声明时)我们用多个值声明它,所以复数看起来很好… 但是我们忽略了一个事实,即enum在声明时指定了它可以拥有的值(从给定的值集中)。这并不意味着该枚举的实例将存储多个值..... 当我们写: enum日期{MON, TUE, WED, THU, FRI, SAT, SUN}; 我们把它变成复数是因为提供了多个值。 然而,当使用(Days day = Days. mon;)我们完全忽略了该枚举的实例应该只有一个值.... 所以当我们写: enum日{MON, TUE, WED, THU, FRI, SAT, SUN}; 我们的意思是有一个枚举,它可以有任何一天作为它的值,所以单数更合适。 尽管(上面已经描述过了),要避免使用单数名称,可以使用任何类型的指示器,如DayEnum或EDay(我更喜欢第二种)....