尽管在 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;}
}
附加信息:也许我的问题不够清楚。在命名我定义的枚举类型的变量时,我经常不得不仔细考虑。我知道最佳实践,但这无助于减轻我命名这些变量的工作。
我不可能将我所有的枚举属性(比如“状态”)公开为“我的状态”。
我的问题:谁能发现我上述约定的潜在问题?这与最佳实践无关。
问题改写:
好吧,我想我应该这样问这个问题:有人能想出一个好的通用方法来命名枚举类型,这样在使用时,枚举“实例”的命名会非常简单吗?
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; }
}
我开始用复数命名枚举,但后来改为单数。在使用它们的环境中似乎更有意义。
enum Status { Unknown = 0, Incomplete, Ready }
Status myStatus = Status.Ready;
相比于:
Statuses myStatus = Statuses.Ready;
我发现单数形式在上下文中听起来更自然。我们一致认为,在声明枚举时,它发生在一个地方,我们在想“这是一组随便什么”,但是在使用它时,大概在很多地方,我们在想“这是一个随便” .
0
作为未知值,这样未初始化的变量默认为 Unknown
。
[Flags]
属性吗?某些东西同时具有“未完成”和“就绪”状态是没有意义的。如果你有 enum [Flags]Steps { First, Second, Third }
,你真的会把你的变量命名为 completedStep
吗?
这种情况从未真正适用于复数。
enum
显示某物的属性。我举个例子:
enum Humour
{
Irony,
Sarcasm,
Slapstick,
Nothing
}
你可以有一种类型,但试着用复数而不是复数来考虑它:
Humour.Irony | Humour.Sarcasm
而不是
Humours { Irony, Sarcasm }
你有幽默感,你没有幽默感。
Humours.Irony | Huomours.Sarcasm
的 Humours
实例?
一般来说,最佳实践建议是单数的,除了那些附加了 [Flags] 属性的枚举(因此可以包含位字段),它应该是复数。
阅读您编辑的问题后,我感觉您可能认为属性名称或变量名称必须与枚举类型名称不同......它没有。以下完全没问题...
public enum Status { New, Edited, Approved, Cancelled, Closed }
public class Order
{
private Status stat;
public Status Status
{
get { return stat; }
set { stat = value; }
}
}
public Color Color { get {...} set {...} }
这是少数几个我不同意该公约以反对它的地方之一。 TBH,我讨厌枚举的定义和它的实例可以具有相同的名称。我专门用“枚举”对我的所有枚举进行后缀,因为它可以清楚地说明它在任何给定用法中的上下文。 IMO 它使代码更具可读性。
public enum PersonTypesEnum {
smart,
sad,
funny,
angry
}
public class Person {
public PersonTypesEnum PersonType {get; set;}
}
没有人会混淆什么是枚举和它的实例是什么。
Enum
没有问题吗?并不是说作者建议用它们的类型对所有变量进行后缀。鉴于提供了一个理由,作者也有一个更强有力的案例,而 M$ 提供了零理由。
进来的有点晚...
您的问题与 you mention (我问过 ;-) 之间有一个重要区别:
您将枚举定义放在类之外,这样您就可以为枚举和属性使用相同的名称:
public enum EntityType {
Type1, Type2
}
public class SomeClass {
public EntityType EntityType {get; set;} // This is legal
}
在这种情况下,我将遵循 MS 指南并为枚举使用单数名称(复数表示标志)。这可能是最简单的解决方案。
我的问题(在 other question 中)是当枚举在类的范围内定义时,阻止使用完全以枚举命名的属性。
如果您尝试编写简单但禁止的代码,如下所示:
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;放; } } 将枚举定义移到类外,最好移到另一个类中。这是上述问题的简单解决方案: public class Characteristics { public enum Gender { Male, Female } } public class Person { public Characteristics.Gender Gender { get;放; } }
enum
,然后再将它嵌套在另一个类中,如果这会导致麻烦呢?
Gender
并将枚举名称设置为 Sex
更有意义。所以isac.Gender = Sex.Male
..
最佳实践 - 使用单数。您有一个组成枚举的项目列表。当您说 Versions.1_0
时,使用列表中的项目听起来很奇怪。说 Version.1_0
更有意义,因为只有一个 1_0 版本。
在另一个线程 C# naming convention for enum and matching property 上,有人指出我认为是一个非常好的主意:
“我知道我的建议违反了 .NET 命名约定,但我个人用 'E' 为枚举加前缀,用 'F' 为枚举标志加前缀(类似于我们用 'I' 为接口加前缀的方式)。”
在枚举声明中使用复数的原因是(在声明时)我们用多个值声明它,所以复数看起来不错......但是我们忽略了这样一个事实,即声明时枚举指定了它可以具有的值(来自给定的一组值)。这并不意味着该枚举的实例将存储多个值.....当我们编写时: enum Days { MON, TUE, WED, THU, FRI, SAT, SUN};由于提供了多个值,我们将其设为复数。但是,当使用 (Days day = Days.MON; ) 时,我们完全忽略了该枚举的实例应该具有单个值....所以当我们编写时:枚举第 { 周一、周二、周三、周四、周五、周六、周日};我们的意思是有一个枚举可以有任何一天作为它的值,所以单数更合适。虽然(上面已经描述过),但要在不使用单数名称的情况下解决这个问题,可以使用任何类型的指标,如 DayEnum 或 EDay(我更喜欢第二个)....
不定期副业成功案例分享
OrderStatus == OrderStatus.Pending
被识别为左侧的变量,然后是右侧的枚举