2012-12-04 15 views
5

मैं कुछ समय के लिए विंडोज मोबाइल और एंड्रॉइड के लिए विकास कर रहा हूं। और मैं इन दो अवधारणाओं के बारे में उलझन में हूं।एनम वीएस स्टेटिक क्लास (सामान्य और स्ट्रिंग मानों के साथ)

मान लें कि मैं उपयोगकर्ता के डिवाइस स्क्रीन आकार के आधार पर निर्णय लेना चाहता हूं। तो मैं इतनी पूर्वनिर्धारित मानों की अपेक्षा करूंगा। मैं अपने तर्क को संभालने के लिए एक स्विच स्टेटमेंट का उपयोग कर सकता था। लेकिन मुझे यकीन नहीं है कि मुझे इस उद्देश्य के लिए एक स्टेटिक क्लास का उपयोग करना चाहिए या नहीं। कौन सा एक बेहतर दृष्टिकोण है। मैं इन दो अलग-अलग तरीकों से अपना तर्क कर सकता हूं। सही दृष्टिकोण कौन सा है? मैं उलझन में हूं। और क्या मेरे लिए स्ट्रिंग मानों का भी उपयोग करना संभव है? क्योंकि वर्तमान में मैं कक्षाओं के साथ चिपक रहा हूं, मुझे सभी enums का उपयोग करने के लिए अद्यतन करने की आवश्यकता है। तो मेरी कक्षा को स्ट्रिंग एनम में बदलने के बारे में कैसे? किसी भी तरह से। धन्यवाद।

Enum

//My predefined values 
public enum ScreenSizeEnum 
{ 
    Small, Medium, Large, XLarge, 
} 
//Handling Logic 
private void SetScreenSize(ScreenSizeEnum Screen) 
{ 
    switch (Screen) 
    { 
     case ScreenSizeEnum.Large: 
      //Do Logic 
      break; 
     case ScreenSizeEnum.Small: 
      //Do Logic 
      break; 
    } 
} 

का प्रयोग कक्षा

//My predefined values 
public class ScreenSizeClass 
{ 
    public const int Small = 0; 
    public const int Medium = 1; 
    public const int Large = 2; 
    public const int XLarge = 3; 
} 
//Handling Logic 
private void SetScreenSize(int Screen) 
{ 
    switch (Screen) 
    { 
     case ScreenSizeClass.Large: 
      //Do Logic 
      break; 
     case ScreenSizeClass.Small: 
      //Do Logic 
      break; 
    } 
} 
+0

enums के साथ डिबगिंग अनुभव बहुत बेहतर है (कम से कम सी # में)। एक 'int' कोड पर स्विच करने वाले सौ मामलों के साथ स्विच डिबग करने का प्रयास करें। –

+0

इस प्रश्न पर एक 'जावा' टैग है। आपके 'enum' के लिए दिखाए गए उदाहरण कोड जावा के साथ काम नहीं करेंगे। जावा में एनम्स 'स्विच' का उपयोग करते समय सी # के साथ काम नहीं करते हैं। – Squonk

+0

हाँ। मुझे पता है कि। मैं अपने एंड्रॉइड एप्लिकेशन में भी वही प्रवाह कर रहा हूं। मैंने सोचा कि अगर मैं जावा कोड भी डालूं तो यह बहुत लंबा हो सकता है। लेकिन मुझे उम्मीद है कि अवधारणा वही है। –

उत्तर

4

Enumeration Types (C# Programming Guide) से:

एक गणना प्रकार (यह भी एक गणना या एक enum नाम) एक प्रदान करता है नामित अभिन्न स्थिरांक के एक सेट को परिभाषित करने का प्रभावी तरीका जो एक चर के लिए असाइन किया जा सकता है।

  1. आप स्पष्ट रूप से ग्राहक कोड के लिए निर्दिष्ट करें कि कौन मूल्यों चर लिए मान्य नहीं हैं

    निम्नलिखित एक अंकीय प्रकार के बजाय एक enum का उपयोग कर के लाभ हैं।

  2. विजुअल स्टूडियो में, IntelliSense परिभाषित मानों को सूचीबद्ध करता है।

तो अगर आप enum गुजरती हैं, यह दृढ़ता से, आपके द्वारा लिखा गया है ताकि आप अपने आप एक विधि में पारित कर सकते हैं क्या पर नियंत्रण पाने के है।

ScreenSizeEnum size = ScreenSizeEnum.Medium; 
SetScreenSize(size); 

const या static क्षेत्रों तुम definetely चाहे पारित कर दिया int मूल्य की उम्मीद व्यापकता से लिया जाता है जांच करने की आवश्यकता का उपयोग करते समय।

int somevalue = ...;//anything 
SetScreenSize(somevalue); //compiles 

private void SetScreenSize(int Screen) 
{ 
    switch (Screen) 
    { 
     case ScreenSizeClass.Large: 
      //Do Logic 
      break; 
     case ScreenSizeClass.Small: 
      //Do Logic 
      break; 
     default: 
      // something else, what to do?? 
      break; 
    } 
} 

टिप्पणियां के आधार पर:

अगर यह जांच करने के लिए आवश्यक है, चाहे कुछ intenum में परिभाषित किया गया है, एक कुछ इस तरह कर सकते हैं:

int somevallue = 0; 
if(Enum.IsDefined(typeof(ScreenSizeEnum), somevallue)) 
{ 
    //it's ok 
} 

या एक विस्तार विधि:

public static T GetEnumValue<T>(this string value) where T : struct 
{ 
    Type t = typeof(T); 
    if (!t.IsEnum) 
     throw new Exception("T must be an enum"); 
    else 
    { 
     T result; 
     if (Enum.TryParse<T>(value, out result)) 
      return result; 
     else 
      return default(T); 
    } 
} 

जो इस्तेमाल किया जा सकता

int somevalue = 1; 
ScreenSizeEnum size = somevalue.GetEnumValue<ScreenSizeEnum>(); 

रूप string के लिए (ओ पी के संपादित प्रश्न के आधार पर):

से enum (C# Reference):

एक enum लिए मंजूरी दे दी प्रकार के होते हैं बाइट, sbyte, लघु, ushort, int, uint, लंबा, या उलझन।

तो आपके पास तारों का एक पंख नहीं हो सकता है। लेकिन आप enums से नामों का उपयोग कर सकते हैं, क्योंकि ToString विधि नाम लौटाती है, न कि एनम का मूल्य।

public static T GetEnumValue<T>(this string value) where T : struct 
{ 
    Type t = typeof(T); 
    if (!t.IsEnum) 
     throw new Exception("T must be an enum"); 
    else 
    { 
     if (Enum.IsDefined(t, value)) 
      return (T)Enum.Parse(t, value); 
     else 
      return default(T); 
    } 
} 

ताकि

int i = (int)ScreenSizeEnum.Small; 
string str = ScreenSizeEnum.Small.ToString(); 
ScreenSizeEnum isize = i.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small 
ScreenSizeEnum strsize = str.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small 
+1

आप हमेशा एक मनमानी 'int' को enum में डाल सकते हैं ताकि आपको अभी भी वैधता के लिए enums जांचना चाहिए। –

+0

@ माइकज़ यह एक और सवाल है और इसके अलावा इसके लिए विधियों का अच्छा समूह भी है। – horgh

+0

इस महान जवाब के लिए धन्यवाद। +1 और स्वीकार करें। :) –

8

का उपयोग करते हुए यह ठीक है क्या enums के लिए कर रहे हैं। नहीं आप स्थिरांक के साथ स्थिर वर्ग उपयोग नहीं कर सकते हैं, लेकिन enum दूर क्लीनर द्वारा है ...

+0

यह सही है। SetScreenSize() के उपयोगकर्ताओं को स्पष्ट रूप से जाना जाता है कि उन्हें विशिष्ट मानों को पारित करना होगा, न कि 640 की तरह स्क्रीन चौड़ाई हो सकती है। – PRouleau

+0

जावा में 'enums' का उपयोग करने का प्रयास न करें जिस तरह से ओपी ने अपने प्रश्न में प्रदर्शित किया है। – Squonk

1

enums मूल रूप से उपयोग किया जाता है जब आप एक चर या पैरामीटर चाहते एक निश्चित से मूल्य के लिए:

ScreenSizeEnum.Small.ToString(); //Small 

तो तुम तार पर एक और विस्तार विधि हो सकता है संभावित स्थिरांक का सेट। आप कक्षा के साथ स्थिर अंतिम int स्थिरांक के सेट के साथ प्रतिस्थापित कर सकते हैं। लेकिन बाद में एक पर enums का उपयोग अधिक लचीला & पठनीय appraoch है।