2009-09-10 82 views
186

我問,儘管看了相似,但這個問題不正是我想在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」。

我的問題:任何人都可以發現潛在的問題與上述我的約定? 這不是最佳做法。

問題重新整理:

嗯,我想我應該問這樣的問題:有人能出來命名枚舉類型的一個很好的通用的方法,例如在使用時,枚舉的命名「實例'將非常簡單?

+4

public enum OrderState ... - public OrderState OrderStatus {get;設置;} – Fraser 2011-03-07 22:33:05

回答

241

微軟建議Enum S使用單數,除非Enum代表位字段(使用FlagsAttribute爲好)。請參閱Enumeration Type Naming Conventions(微軟的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; } 
} 
+11

是的,這是一個正確的答案。這個指南被用在.Net框架中。枚舉DayOfWeek並標記枚舉RegexOptions。 – 2009-09-10 15:37:38

+1

是的,這是推薦的做法,我很歡迎。但它不回答我的問題。 – 2009-09-10 15:41:46

+1

@ o.k.w進一步詳細說明,雖然它看起來很醜,但如果你需要一個標誌枚舉中的單個值,那麼對於字段/屬性/參數使用單數形式。如果您支持設置多個標誌,請使用複數形式。如果你的枚舉不是一個標誌枚舉,使用單數的類型名稱和字段/屬性/參數。 – 2011-10-03 13:42:42

10

一般而言,除了那些具有[Flags]屬性的枚舉(因此它可以包含位域),最好的實踐建議是單數的,這應該是複數。

在閱讀您編輯的問題後,我感覺您可能認爲屬性名稱或變量名稱必須與枚舉類型名稱不同......它沒有。以下是完全沒有問題......

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

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

的確,我想我的方法是避免使用枚舉時需要考慮名稱的「快速和懶惰」的方式。 – 2009-09-10 15:10:42

+1

支持您的答案:在MSDN上,從[類型成員名稱](https://docs.microsoft.com/zh-cn/dotnet/standard/design-guidelines/names-of-type-members) 「屬性名稱」部分:**✓CONSIDER **給予屬性與其類型相同的名稱。 **示例:**'public Color Color {get {...} set {...}} – DavidRR 2017-07-20 18:07:25

28

我開始了命名複數枚舉但此後改爲單數。只是在使用它們的地方似乎更有意義。

enum Status { Unknown = 0, Incomplete, Ready } 

Status myStatus = Status.Ready; 

對比:

Statuses myStatus = Statuses.Ready; 

我覺得單數形式的聲音在上下文中更自然。我們同意,當在一個地方聲明枚舉時,我們認爲「這是一羣凡是」,但是當使用它時,可能在很多地方,我們認爲「這是一個什麼」 。

+5

稍後的反應(也許有點偏離主題)但我建議使用值'0'作爲未知值,這樣一個未初始化的變量默認爲'Unknown'。 – SvenL 2016-01-27 06:49:47

+0

同意,@SvenL。相應地更新示例。 – 2016-11-14 15:29:32

+0

你真的會在你的例子中放置一個'[Flags]'屬性嗎?對於「不完整」和「準備好」狀態的東西沒有意義。如果你有'enum [Flags] Steps {First,Second,Third}',你真的會命名變量'completedStep'嗎? – Pakman 2018-02-01 04:42:09

6

最佳實踐 - 使用單數。你有一個組成Enum的項目列表。當您說Versions.1_0時,使用列表中的項目聽起來很奇怪。因爲只有一個1_0版本,所以說Version.1_0更有意義。

20

這種情況從來都不適用於複數形式。

enum顯示某個屬性或另一個屬性。我舉一個例子:

enum Humour 
{ 
    Irony, 
    Sarcasm, 
    Slapstick, 
    Nothing 
} 

你可以有一個類型,但在多嘗試想起來了,而不是複數:

Humour.Irony | Humour.Sarcasm

不是

Humours { Irony, Sarcasm }

你有幽默感,你沒有幽默感。

+1

哈哈,好的,程序員並不總是語法/政治正確。在你的情況下,我可能使用「HumourTypes」。壞的習慣,我猜。 – 2009-09-10 15:23:22

+4

是的,我喜歡英國的幽默。 – Epaga 2010-02-16 09:46:43

+0

如果我想搜索所有具有諷刺意義或有諷刺意味的個人,我會不會將搜索例程傳遞給包含「Humours.Irony |」的「Humours」實例。 Huomours.Sarcasm' ?? – 2014-09-13 17:24:14

4

即將在有點晚了......

有你的問題和一個you mention(我問;-)之間的一個重要區別:

你把枚舉定義出來的類,它讓你擁有的枚舉和屬性相同的名字:

public enum EntityType { 
    Type1, Type2 
} 

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

} 

在這種情況下,我會按照MS guidelins和枚舉(複數爲標誌)使用奇異的名字。這是最簡單的解決方案。

我的問題(在other question)是當枚舉在類的範圍內定義時,阻止使用在枚舉之後完全命名的屬性。

3

如果你試圖寫簡單,但禁止這樣的代碼:

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推薦和使用前綴或後綴的枚舉名:

    public class Person 
    { 
        public enum GenderEnum 
        { 
         Male, 
         Female 
        } 
        public GenderEnum Gender { get; set; } 
    } 
    
  2. 將枚舉定義移到類之外,最好是進入另一個班級。下面是一個簡單的解決方案上面:

    public class Characteristics 
    { 
        public enum Gender 
        { 
         Male, 
         Female 
        } 
    } 
    public class Person 
    { 
        public Characteristics.Gender Gender { get; set; } 
    } 
    
+2

假設的情況並不是一個好的解決方案。爲什麼首先使用嵌套的'enum',然後將它嵌套在另一個類中,如果這樣會造成麻煩? – 2012-08-06 22:00:11

+1

在性別的情況下,將「性別」屬性名稱和「枚舉」的枚舉名稱命名爲「性別」更有意義。所以'isac.Gender = Sex.Male' .. – nawfal 2013-03-29 12:11:42

+2

我不知道爲什麼這個人是downvoted。這種情況是合理的,遠非假設。在C#中嵌套枚舉類型的原因類似,可能會使用Java中的內部類...因爲內部類型僅用於外部和其他地方,並且僅在外部而不是其他地方使用內部類型。由於編譯器的限制,您必須選擇其中一種解決方案。 – 2013-08-14 00:56:15

2

這是我與約定足夠去反對它不同意的幾個地方之一。 TBH,我暗示枚舉的定義和它的實例可以有相同的名稱。我用「Enum」特別後綴所有的枚舉,因爲它明確了它在任何給定用法中的上下文。海事組織使得代碼更具可讀性。

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


public class Person { 
    public PersonTypesEnum PersonType {get; set;} 
} 

沒有人會混淆枚舉和什麼是實例。