2009-09-10 14 views
186

मैं इसी तरह पढ़ लेकिन बावजूद इस सवाल पूछ रहा हूँ नहीं वास्तव में क्या मैं मैंने पाया मैं एक प्रवृत्ति बहुवचन में enums नाम के लिए और फिर 'उपयोग' उन्हें विलक्षण है C# naming convention for enum and matching propertyEnum नामकरण कन्वेंशन - बहुवचन

पर चाहते हैं, उदाहरण:

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 प्रकारों के चर नामकरण करते समय मुझे अक्सर कड़ी मेहनत करनी पड़ती है। मैं सबसे अच्छा अभ्यास जानता हूं, लेकिन यह उन चरों को नाम देने के अपने काम को कम करने में मदद नहीं करता है।

मैं संभवतः अपने सभी enum गुणों ("स्थिति") को "MyStatus" के रूप में प्रकट नहीं कर सकता।

मेरा प्रश्न: क्या कोई ऊपर वर्णित मेरे सम्मेलन के साथ संभावित समस्या पा सकता है? यह सर्वोत्तम अभ्यास के बारे में नहीं है।

सवाल rephrase:

ठीक है, मुझे लगता है मैं सवाल इस तरह से पूछना चाहिए: किसी enum प्रकार के नामकरण का एक अच्छा सामान्य तरीके से बाहर आ सकते हैं ऐसी है कि जब इस्तेमाल किया, enum के नामकरण ' उदाहरण 'बहुत सरल होगा?

+4

सार्वजनिक enum ऑर्डरस्टेट ... - सार्वजनिक ऑर्डरस्टेट ऑर्डरस्टैटस {प्राप्त करें; सेट;} – Fraser

उत्तर

241

माइक्रोसॉफ्ट Enum रों के लिए विलक्षण का उपयोग कर जब तक 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

हां, यह एक सही उत्तर है। यह guidlines .Net Framework उदा। Enum DayOfWeek और झंडे enum RegexOptions। –

+1

हां, यह अनुशंसित अभ्यास है, मैं इसका स्वागत करता हूं। हालांकि यह मेरे प्रश्न का उत्तर नहीं देता है। –

+1

@ o.k.w आगे विस्तृत करने के लिए, हालांकि यह बदसूरत लग रहा है, अगर आपको ध्वज enum से एक ही मूल्य की आवश्यकता है तो क्षेत्र/संपत्ति/तर्क के लिए एकवचन रूप का उपयोग करें। यदि आप इसे एकाधिक झंडे सेट करने का समर्थन करते हैं, तो बहुवचन का उपयोग करें। यदि आपका enum एक झंडे enum नहीं है, प्रकार के नाम और क्षेत्र/संपत्ति/तर्क के लिए एकवचन का उपयोग करें। –

10

सामान्य रूप से, सर्वोत्तम अभ्यास अनुशंसा एकवचन है, उन उन enums को छोड़कर जिनके पास [झंडे] विशेषता है, (और इसलिए जो छोटे फ़ील्ड हो सकते हैं), जो बहुवचन होना चाहिए।

अपना संपादित प्रश्न पढ़ने के बाद, मुझे लगता है कि आपको लगता है कि संपत्ति का नाम या परिवर्तनीय नाम enum प्रकार के नाम से अलग होना चाहिए ... ऐसा नहीं है। निम्नलिखित

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

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

सच है, मुझे लगता है कि मेरी विधि enums का उपयोग करते समय नामों के बारे में सोचने की आवश्यकता से बचने का एक 'त्वरित और आलसी' तरीका है। –

+1

आपके उत्तर के समर्थन में: एमएसडीएन पर, [प्रकार के सदस्यों के नाम] से (https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-type-members) में खंड "गुणों के नाम": ** ✓ CONSIDER ** एक संपत्ति को उसी प्रकार के नाम के रूप में देना। ** उदाहरण: ** 'सार्वजनिक रंगीन रंग {प्राप्त करें {...} सेट {...}} ' – DavidRR

28

मैं बहुवचन में enums नामकरण बाहर शुरू कर दिया लेकिन जब से विलक्षण करने के लिए बदल गया है। ऐसा लगता है कि उनका उपयोग कहां किया जाता है, इसके संदर्भ में और अधिक समझ में आता है।

Statuses myStatus = Statuses.Ready; 

मैं विलक्षण रूप संदर्भ में और अधिक प्राकृतिक ध्वनि करने के लिए लगता है:

enum Status { Unknown = 0, Incomplete, Ready } 

Status myStatus = Status.Ready; 

से तुलना करें। हम इस बात पर सहमत हैं कि एक स्थान पर होने वाली enum घोषित करते समय, हम सोच रहे हैं कि "यह व्हाट्सवर्स का एक समूह है", लेकिन इसका उपयोग करते समय, संभवतः कई स्थानों पर, हम सोच रहे हैं "यह एक भी है" ।

+5

थोड़ा देर से प्रतिक्रिया (और शायद थोड़ा सा विषय) लेकिन: मैं मूल्य '0' का उपयोग करने का सुझाव दूंगा अज्ञात मान, इस तरह एक अनियमित चर डिफ़ॉल्ट 'अज्ञात' है। – SvenL

+0

सहमत, @SvenL। तदनुसार अद्यतन उदाहरण। –

+0

क्या आप वाकई अपने उदाहरण पर '[ध्वज]' विशेषता डाल देंगे? कुछ "अपूर्ण" और "तैयार" दोनों की स्थिति रखने के लिए यह समझ में नहीं आता है। यदि आपके पास 'enum [ध्वज] चरण {पहला, दूसरा, तीसरा} था, तो क्या आप वास्तव में अपने चर' पूरा चरण 'नाम देंगे? – Pakman

6

सर्वोत्तम अभ्यास - एकवचन का उपयोग करें। आपके पास ऐसी चीजों की एक सूची है जो एक एनम बनाते हैं। जब आप Versions.1_0 कहते हैं तो सूची में किसी आइटम का उपयोग करना अजीब लगता है। यह Version.1_0 कहने के लिए और अधिक समझ में आता है क्योंकि केवल एक 1_0 संस्करण है।

20

स्थिति वास्तव में बहुवचन पर लागू नहीं होती है।

एक enum कुछ या किसी अन्य की विशेषता दिखाता है। मैं एक उदाहरण देता हूँ:

enum Humour 
{ 
    Irony, 
    Sarcasm, 
    Slapstick, 
    Nothing 
} 

आप एक प्रकार हो सकता है, लेकिन कई में यह के बारे में सोच की कोशिश, बल्कि बहुवचन से:

Humour.Irony | Humour.Sarcasm

बजाय

Humours { Irony, Sarcasm }

आपके पास विनोद की भावना है, आपके पास विनोद की भावना नहीं है।

+1

हाहा, ठीक है, प्रोग्रामर हमेशा व्याकरणिक/राजनीतिक रूप से सही नहीं होते हैं। आपके मामले में, मैं संभावित रूप से "HumourTypes" का उपयोग करता हूं। मुझे लगता है कि खराब आदत। –

+4

हाँ मैं ब्रिटिश विनोद से प्यार करता हूँ। – Epaga

+0

क्या होगा यदि मैं उन सभी व्यक्तियों को खोजना चाहता हूं जिनके पास सरकस्म की भावना है या विडंबना की भावना है, तो क्या मैं खोज रूटीन को 'हास्य' के उदाहरण 'Humours' का उदाहरण नहीं दूंगा। Huomours.Sarcasm' ?? –

0

अन्य धागा C# naming convention for enum and matching property किसी ने बताया कि मैं क्या लगता है कि एक बहुत अच्छा विचार है पर:

"मुझे पता है मेरा सुझाव नेट नामकरण सम्मेलनों के खिलाफ जाता है, लेकिन मैं 'ई' और enum झंडे के साथ व्यक्तिगत रूप से उपसर्ग enums 'एफ' के साथ (हम 'I' के साथ इंटरफेस को कैसे उपसर्ग करते हैं)। "

4

थोड़ी देर हो चुकी में आ रहा है ...

वहाँ अपने प्रश्न और एक you mention (जो मैंने पूछा ;-) के बीच एक महत्वपूर्ण अंतर है:

आप कक्षा से बाहर enum परिभाषा शब्दों में कहें, जो आप enum और संपत्ति के लिए एक ही नाम है की अनुमति देता है:

public enum EntityType { 
    Type1, Type2 
} 

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

} 

इस मामले में, मैं एमएस guidelins का पालन करें और enum (झंडे के लिए बहुवचन) के लिए एक विलक्षण नाम का उपयोग करेंगे। यह सबसे आसान समाधान probaby है।

मेरी समस्या (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. पर ध्यान न दें एमएस सिफारिश और enum नाम पर एक उपसर्ग या प्रत्यय का उपयोग :

    public class Person 
    { 
        public enum GenderEnum 
        { 
         Male, 
         Female 
        } 
        public GenderEnum Gender { get; set; } 
    } 
    
  2. कक्षा के बाहर enum परिभाषा को ले जाएं, अधिमानतः एक और कक्षा में।

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

हाइपोटेटिकल स्थिति और एक अच्छा समाधान नहीं है। पहली जगह में नेस्टेड 'एनम' का उपयोग क्यों करें और फिर इसे किसी अन्य वर्ग में घोंसला दें यदि इससे परेशानी होती है? –

+1

लिंग के मामले में, संपत्ति का नाम 'लिंग' और enum नाम 'लिंग' के रूप में अधिक अर्थपूर्ण है। तो 'isac.Gender = Sex.Male' .. – nawfal

+2

मुझे यकीन नहीं है कि इस लड़के को क्यों कम किया जा रहा है। यह स्थिति वैध है और कल्पनात्मक से बहुत दूर है। इसी तरह के कारणों के लिए सी # में एक घोंसले enum प्रकार टाइप करता है कि कोई जावा में एक आंतरिक वर्ग का उपयोग कर सकता है ... क्योंकि आंतरिक प्रकार केवल बाहरी और कहीं और में उपयोग नहीं किया जाता है, और केवल बाहरी के संदर्भ में और कहीं और नहीं समझता है। और संकलक सीमाओं के परिणामस्वरूप, आपको उल्लिखित समाधानों में से एक चुनना होगा। –

2

यह कुछ स्थानों पर है कि मैं सम्मेलन इसके खिलाफ जाने के लिए पर्याप्त से असहमत में से एक है: यहाँ ऊपर के लिए एक आसान उपाय है। टीबीएच, मुझे नफरत है कि एक enum की परिभाषा और इसके उदाहरण के समान नाम हो सकता है।मैं अपने सभी Enums को "Enum" के साथ पोस्टफिक्स करता हूं क्योंकि यह स्पष्ट करता है कि इसका संदर्भ किसी भी दिए गए उपयोग में क्या है। आईएमओ यह कोड को और अधिक पठनीय बनाता है।

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


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

कोई भी कभी भी भ्रमित नहीं होगा कि यह क्या है और इसका क्या उदाहरण है।

संबंधित मुद्दे