2009-09-10 13 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;} 

} 

追加情報: はたぶん私の質問は十分に明確ではありませんでした。私は、定義されたenum型の変数に名前を付けるときに、しばしば懸命に考える必要があります。私はベストプラクティスを知っていますが、それらの変数に名前を付けるのが簡単ではありません。

"MyStatus"としてすべての列挙型プロパティ(「ステータス」など)を公開することはできません。

私の質問:誰も上記の私の大会の潜在的な問題を見つけることができますか? ベストプラクティスではありません。

質問言い直す:

まあ、私は質問をこのように依頼する必要がありますね:誰かが列挙型は、列挙型の使用、命名 "という命名の良い一般的な方法を出て来ることができますインスタンス 'はかなり簡単でしょうか?

+4

公開列挙型OrderState ... - パブリックOrderState OrderStatus {get; set;} – Fraser

答えて

241

MicrosoftはEnumは、ビットフィールド(同様FlagsAttributeを使用)を表していない限りEnum秒間単数使用することをお勧めします。 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; } 
} 
+11

はい、これは正解です。このガイドラインは.Net Frameworkなどで使用されています。 DayOfWeekをenumし、RegexOptionsをenumします。 –

+1

はい、これはお勧めの練習です、私はそれを歓迎します。しかし、私の質問には答えません。 –

+1

@ o.k.wさらに詳しく説明すると、醜いように見えますが、フラグenumから単一の値が必要な場合は、フィールド/プロパティ/引数に単数形を使用してください。複数のフラグが設定されている場合は、複数のフラグを使用してください。列挙型がフラグ列挙型でない場合は、型名とフィールド/プロパティ/引数の単数型を使用します。 –

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

実際、私のメソッドは列挙型を使うときに名前を考える必要を避けるための「素早く怠惰な」方法だと思います。 –

+1

あなたの答えをサポートします:MSDNでは、[タイプメンバーの名前](https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members)のセクションの "プロパティの名前":**✓注意**プロパティの型と同じ名前を与えます。 **例:** 'public Color Color {get {...}} { – DavidRR

28

私は複数で列挙型を命名出始めたが、以降は単数形に変更されました。彼らがどこで使用されているのかという文脈の中でもっと意味をなさないようです。私は文脈により自然な音に単数形を見つける

Statuses myStatus = Statuses.Ready; 

enum Status { Unknown = 0, Incomplete, Ready } 

Status myStatus = Status.Ready; 

は、と比較してください。私たちは、ある場所で起こるenumを宣言するとき、「これは一種のwhattversです」と考えていますが、おそらく多くの場所でそれを使用すると「これは何でも」と思っています。

+5

ちょっと遅れた反応です。未知の値です。初期化されていない変数は、デフォルトで「不明」です。 – SvenL

+0

合意、@SvenL。それに応じて例を更新。 –

+0

実際にあなたの例に '[Flags]'属性を入れてもいいですか?何かが「不完全」と「準備完了」の両方のステータスを持つことは意味をなさない。あなたが 'enum [Flags] Steps {First、Second、Third}'を持っていたら、実際にあなたの変数に 'completedStep'という名前を付けますか? – Pakman

6

ベストプラクティス - 単数形を使用してください。 Enumを構成するアイテムのリストがあります。 Versions.1_0と言うと、リスト内の項目を使用すると奇妙に聞こえます。 Version.1_0と言うのは、1_0バージョンが1つしかないので意味があります。

20

状況は決して複数には当てはまりません。

enumは、何か別の属性を示します。私は例をあげる:

enum Humour 
{ 
    Irony, 
    Sarcasm, 
    Slapstick, 
    Nothing 
} 

あなたは1種類を持っているのではなく、複数のよりも、複数でそれを考える試すことができます。

Humour.Irony | Humour.Sarcasm

よりもむしろ

Humours { Irony, Sarcasm }

あなたはユーモアのセンスがあります。ユーモアのセンスはありません。

+1

まあ、プログラマーは文法的に/政治的に正しいとは限りません。あなたの場合、私はおそらく "HumourTypes"を使用します。私が推測する悪い習慣。 –

+4

ええ、私は英国のユーモアが大好きです。 – Epaga

+0

風刺り感があるか、皮肉な感覚を持つすべての人を検索したいのであれば、検索ルーチンに「Humours.Irony | Huomours.Farcasm' ?? –

0

は、他のスレッドでC# naming convention for enum and matching property誰かが、私は非常に良いアイデアだと思うものを指摘した:

「私は私の提案は、.NET命名規則に反する知っているが、私個人的に接頭辞 『E』を持つ列挙型と列挙型フラグ(私たちがInterfacesに 'I'をどのように接頭辞付けするかと同じように) 'F'を使用します。少し遅れに来る

4

...

あなたの質問と私は;-)尋ねた1 you mention(重要な違いがあります

あなたはクラスのうち、列挙型の定義を置くが、どのあなたは、列挙型とプロパティで同じ名前持つことができます。この場合

public enum EntityType { 
    Type1, Type2 
} 

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

} 

を、私はMSのguidelinsに従い、列挙型(フラグの複数)のための単数形の名前を使用すると思います。それは最も簡単なソリューションです。

私の問題(other question)は、enumがクラスのスコープ内で定義されているため、enumの直後にあるプロパティの使用を妨げています。あなたはこのような単純な、まだ禁じコードを書くしようとしている場合

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'を使うのはなぜですか?これがトラブルの原因になるのであれば、別のクラスにネストしてください。 –

+1

ジェンダーの場合は、プロパティ名を「性別」、列挙名を「性別」とする方がはるかに意味があります。だから 'isac.Gender = Sex.Male' .. – nawfal

+2

私はこの男がなぜ落選したのか分かりません。この状況は正当なものであり、仮説からは程遠いものです。 C#では、内部クラスが外部でのみ使用され、他の場所では使用されず、外部のコンテキストでのみ意味があり、他の場所では使用されないため、C#では列挙型がJavaで内部クラスを使用する可能性があります。そして、コンパイラの制限の結果として、上記のソリューションの1つを選択する必要があります。 –

2

これは私がそれに逆らうのに十分な慣習に反対する数少ない場所の一つです。 TBH、私は列挙体の定義とそのインスタンスが同じ名前を持つことができないのは嫌です。私はすべてのEnumを "Enum"で後置するのは、特定の用途でそのコンテキストが何であるかを明確にしているからです。 IMOはコードをもっと読みやすくします。

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


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

この列挙型とそのインスタンスは混同されることはありません。