2013-05-14 6 views
16

मैं बहुत की तरह एक enum संपत्ति के साथ एक वर्ग है: ColorType संपत्ति कभी स्थापित किया जा रहा बिनाकैसे बताएं कि एक enum संपत्ति सेट किया गया है या नहीं? सी #

var foo = new Foo(); 

:

public class Foo 
{ 
    public Color ColorType {get;set;} 
} 

public enum Color 
{ 
    Red, 
    Green, 
} 

अब इस वर्ग के इतने की तरह प्रारंभ किया जा सकता है। अब, मैं उदाहरण के लिए मैं एक विधि है

private void checkEnum(Foo foo) 
{ 
    if(foo.ColorType !=null) 
    { 
     //perform these actions 
    }else 
    { 
     //perform those actions 
    } 
} 

लेकिन मैं कह रही है कि मान शून्य कभी नहीं होगा यह चेतावनी मिलती है और एक विधि बना सकते हैं और या नहीं कि enum कभी स्थापित किया गया था पर कार्रवाई करने के लिए कोशिश कर रहा हूँ, आगे के शोध पर, यदि enum कभी सेट नहीं किया गया है, तो पहले मान के लिए डिफ़ॉल्ट होगा जो मेरे मामले में लाल हो जाएगा, मैं अपने enum में एक मूल्य जोड़ने के बारे में सोच रहा था जो 'सेट नहीं' होगा और वह मान पहले वाला बना देगा , इसलिए यदि यह सेट नहीं किया गया है तो enum के पास 'सेट नहीं' मान होगा, क्या ऐसा करने का एक बेहतर तरीका है, मेरी प्रस्तावित विधि ऐसा लगता है कि यह गन्दा हो सकता है

+0

आप चाहिए यहां अपना उत्तर ढूंढने में सक्षम हो: http://stackoverflow.com/questions/4967656/what-is-the-default-value-for-enum-variable –

उत्तर

26

आप दो विधियों में से एक का उपयोग कर सकते हैं: डिफ़ॉल्ट enum value या nullable enum।

डिफ़ॉल्ट enum मूल्य

के बाद से एक enum एक पूर्णांक के द्वारा समर्थित है, और int शून्य करने के लिए चूक, enum हमेशा शून्य करने के लिए मूल्य के बराबर करने के लिए डिफ़ॉल्ट रूप से प्रारंभ हो जाएगा। जब तक आप स्पष्ट रूप से enum मान असाइन नहीं करते हैं, पहला मान हमेशा शून्य होगा, दूसरा एक होगा, और इसी तरह।

public enum Color 
{ 
    Undefined, 
    Red, 
    Green 
} 

// ... 

Assert.IsTrue(Color.Undefined == 0); // success! 

Nullable enum

असाइन नहीं किए गए enum को संभालने के लिए अन्य तरीके से एक नल क्षेत्र का प्रयोग है।

public class Foo 
{ 
    public Color? Color { get; set; } 
} 

// ... 

var foo = new Foo(); 
Assert.IsNull(foo.Color);  // success! 
+1

अच्छा उत्तर है लेकिन यह उपयोगकर्ता के सक्षम होने के मुद्दे को हल करने में विफल रहता है मान को शून्य या अपरिभाषित करने के लिए सेट करें और इस प्रकार आप नहीं जानते कि उपयोगकर्ता ने इस पर enum सेट किया है या यदि enum बदल नहीं है। –

+1

@MrUniverse सत्य, आप एक बुलियन ध्वज फ़ील्ड पेश कर सकते हैं जो पहली बार 'रंग' मान बदल दिया गया है। हालांकि, आपको सावधानी बरतनी होगी, और यह सुनिश्चित करना होगा कि वर्ग कभी भी इस तरह से निराशाजनक नहीं है जो इसे झूठी सकारात्मक बनाता है। –

+0

क्या होगा यदि यह '[UserModifiedMonitor]' जैसी विशेषता थी जो सेटटर कहलाते समय सत्य पर सेट हो जाता है? मुझे नहीं लगता कि गुण कभी कक्षा के साथ deserialized हैं। –

0

enum एक मान प्रकार है इसलिए यह शून्य नहीं हो सकता है, और भंडारण आमतौर पर एक पूर्णांक होता है। आप अपने प्रकार के लिए एक अपरिभाषित मूल्य चाहते हैं, आप

public enum Color 
{ 
    Undefined, 
    Red, 
    Green, 
} 
0

आप की खोज की है के रूप में हो सकता है, सी # में enumerations मूल्य प्रकार के होते हैं (वे अनिवार्य रूप से पूर्णांक हैं) प्रकार का संदर्भ नहीं तो वे शून्य पर डिफ़ॉल्ट नहीं होगा बल्कि गणना में सबसे कम पूर्णांक मूल्य। Enums से निपटने के दौरान इस रिश्ते को न खोएं क्योंकि यह उनके सबसे उपयोगी गुणों में से एक है। हमेशा याद रखें, कि क्या आप स्पष्ट रूप से यह राज्य या नहीं

public enum Color 
{ 
    Red, 
    Green 
} 

के बराबर:

public enum Color 
{ 
    Red = 0, 
    Green = 1 
} 

हालांकि आप निश्चित रूप से प्रत्येक गणन सदस्य किसी भी पूर्णांक मान आप की तरह दे सकता है।

जहाँ तक वहाँ ऐसा करने का एक बेहतर तरीका है या नहीं, के रूप में, यह वास्तव में सभी के लिए क्या "इस" है पर निर्भर करता है, बस निम्नलिखित enum सेटअप का उपयोग करने का अपने सुझाव के साथ कुछ भी गलत नहीं है, हालांकि:

public enum Color 
{ 
    None = 0, 
    Red, 
    Green 
} 

आम तौर पर आप enums का उपयोग करना चाहते हैं जब आपके पास संभावित मूल्यों का एक निश्चित रूप से सीमित और अलग सेट होता है जिसे आप नाम से चुनने में सक्षम होना चाहते हैं। उदाहरण के लिए, कहें कि मेरे पास एक विधि है जो पैरामीटर के रूप में 4 कार्डिनल दिशानिर्देशों (उत्तर, पूर्व, दक्षिण, पश्चिम) में से एक लेती है। मैं निर्णय लेता हूं कि मैं उत्तर दिशा के लिए 0 से शुरू होने वाले घड़ी के क्रम में प्रत्येक दिशा को संख्याबद्ध करना चाहता हूं।

public enum Direction 
{ 
    North = 0, 
    East, 
    South, 
    West 
} 

अब, बजाय मेरी समारोह एक पूर्णांक पैरामीटर होने और पर भरोसा मुझे याद होगा कि क्या प्रत्येक संख्या दर्शाता है की, मैं अब समारोह एक पैरामीटर के रूप में एक गणन सदस्य लेने के लिए और तुरंत पता कर सकते हैं जो दिशा मैं मैं कर रहा हूँ उदाहरण के लिए:

getNeighbor(1); 

बहुत आसान पढ़ता के रूप में:

getNeighbor(Direction.East); 
1

Enums Value Types कर रहे हैं, जिसका मतलब है कि वे एक वस्तु कहीं और संग्रहीत करने के लिए संदर्भ नहीं हैं, और इसलिए वे null नहीं हो सकता।उनके पास हमेशा int की तरह डिफ़ॉल्ट मान होता है जो सृजन पर शून्य पर डिफ़ॉल्ट होगा।

  1. एक और enum प्रविष्टि जैसे कहा जाता है, शून्य के बराबर मूल्य के साथ None जोड़ें: मैं दो दृष्टिकोण सुझाव देते हैं। इस तरह आपका enum मान सृजन पर None पर डिफ़ॉल्ट होगा। फिर आप if(foo.ColorType != Color.None) देख सकते हैं।

  2. अपनी Color संपत्ति को एक शून्य जैसा बनाएं: public Color? ColorType { get; set; }। अब यह null पर डिफ़ॉल्ट होगा और इसे null मान दिया जा सकता है। nullable प्रकारों के बारे में यहां और पढ़ें: MSDN - Nullable Types (C#)

2

आपके पास दो वास्तविक विकल्प हैं। पहला एनम के लिए एक अनिर्धारित मूल्य जोड़ना है। संपत्ति शुरू होने से पहले यह डिफ़ॉल्ट मान होगा।

1)

public enum Color 
{ 
    Undefined, 
    Red, 
    Green, 
} 
की तरह अपने चेक के साथ

:

private void checkEnum(Foo foo) 
{ 
    if(foo.ColorType == Color.Undefined) 
    { 
     //perform these actions 
    }else 
    { 
     //perform those actions 
    } 
} 

2) वैकल्पिक रूप से आप अपरिभाषित मूल्य नहीं जोड़ सकते हैं और सिर्फ संपत्ति Nullable

public class Foo 
{ 
    public Color? ColorType {get;set;} 
} 
public enum Color 
{ 
    Red, 
    Green, 
} 

बनाने और प्रदर्शन आपकी जांच जैसे:

private void checkEnum(Foo foo) 
{ 
    if(!foo.ColorType.HasValue) 
    { 
     //perform these actions 
    }else 
    { 
     //perform those actions 
    } 
} 
5

आप इसे बना सकते हैं ताकि अंतर्निहित निजी क्षेत्र शून्य हो लेकिन संपत्ति नहीं है।

उदा।

class SomeClass 
{ 
    private Color? _color; // defaults to null 

    public Color Color 
    { 
     get { retrun _color ?? Color.Black; } 
     set { _color = value; } 
    } 

    public bool ColorChanged 
    { 
     get { return _color != null; } 
    } 
} 

इस तरह अगर रंग == बातिल आप जानते हैं कि यह अभी तक सेट नहीं किया गया है और आप भी null (या undefined अन्य उत्तर निर्दिष्ट के रूप में) करने के लिए यह सेट करने से उपयोगकर्ता को रोकने के कर रहे हैं। यदि colornull है तो आपके पास 100% निश्चितता है कि उपयोगकर्ता ने इसे कभी भी सेट नहीं किया है।

केवल पकड़ get द्वारा लौटाया गया डिफ़ॉल्ट मान है, लेकिन यदि आप अपने कार्यक्रम से बेहतर मेल खाते हैं तो आप हमेशा एक को फेंक सकते हैं।

आप भी इसे एक कदम आगे यह बनाकर ताकि set ओनली फ़ील्ड सेट करता है, तो दिए गए मूल्य डिफ़ॉल्ट मान के बराबर नहीं है ले जा सकते हैं (आपके उपयोग के मामले के आधार पर):

public Color Color 
{ 
    get { retrun _color ?? Color.Black; } 
    set 
    { 
     if (value != Color) 
     { 
      _color = value; 
     } 
    } 
} 
+0

आप 'वापसी रंग भी कर सकते हैं ?? Color.Black'। – Moira

+0

@ 1blustone धन्यवाद, उत्तर में कुछ सामान्य सुधार और तय किया। –

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