2009-07-30 10 views
5

मैं सी # गणनाओं के बारे में सोच रहा था और डुप्लिकेट मानों के साथ क्या होता है।सी # गणना और डुप्लिकेट मूल्य - खतरे?

namespace ConsoleTest 
{ 

    enum TestEnum 
    { 
     FirstElement = -1, 
     SecondElement, 
     ThirdElement, 
     Duplicate = FirstElement 
    } 

    /// <summary> 
    /// Summary description for MainConsole. 
    /// </summary> 
    public class MainConsole 
    { 
     /// <summary> 
     /// Constructor for the class. 
     /// </summary> 
     public MainConsole() 
     { 
      // 
      // TODO: Add constructor logic here 
      // 
     } 
     /// <summary> 
     /// Entry point for the application. 
     /// </summary> 
     /// <param name="args">Arguments to the application</param> 
     public static void Main(string[] args) 
     { 
      TestEnum first = TestEnum.FirstElement; 
      TestEnum second = TestEnum.SecondElement; 
      TestEnum duplicate = TestEnum.Duplicate; 

      foreach (string str in Enum.GetNames(typeof(TestEnum))) 
      { 
       Console.WriteLine("Name is: " + str); 
      } 

      Console.WriteLine("first string is: " + first.ToString()); 
      Console.WriteLine("value is: " + ((int)first).ToString()); 
      Console.WriteLine("second string is: " + second.ToString()); 
      Console.WriteLine("value is: " + ((int)second).ToString()); 
      Console.WriteLine("duplicate string is: " + duplicate.ToString()); 
      Console.WriteLine("value is: " + ((int)duplicate).ToString()); 

      TestEnum fromStr = (TestEnum)Enum.Parse(typeof(TestEnum), "duplicate", true); 
      Console.WriteLine("fromstr string is: " + fromStr.ToString()); 
      Console.WriteLine("value is: " + ((int)fromStr).ToString()); 
      if (fromStr == TestEnum.Duplicate) 
      { 
       Console.WriteLine("Duplicate compares the same as FirstElement"); 
      } 
      else 
      { 
       Console.WriteLine("Duplicate does NOT compare the same as FirstElement"); 
      } 

     } 
    } 
} 

निम्नलिखित में से कौन उत्पादन का उत्पादन:

Name is: SecondElement 
Name is: ThirdElement 
Name is: FirstElement 
Name is: Duplicate 
first string is: FirstElement 
value is: -1 
second string is: SecondElement 
value is: 0 
duplicate string is: FirstElement 
value is: -1 
fromstr string is: FirstElement 
value is: -1 
Duplicate compares the same as FirstElement 
Press any key to continue . . . 

यह मैं क्या चाहते हो सकता है और के बाद से मैं कुछ का निर्माण कर रहा हूँ कि एक संस्करण की उम्मीद करने लगता है मैं चीजों को बाहर का परीक्षण करने के लिए निम्न छोटे कार्यक्रम बनाया टैग हर बार बढ़ेगा, इसलिए मुझे कुछ ऐसा चाहिए जो मैं वर्तमान संस्करण को "असाइन" कर सकता हूं, और इसकी तुलना भी कर सकता हूं।

यहां प्रश्न है हालांकि: इस दृष्टिकोण के नुकसान क्या हैं? क्या कोई है? क्या यह सिर्फ खराब शैली है (मैं thedailywtf पर खत्म नहीं करना चाहता)? क्या ऐसा कुछ करने का कोई बेहतर तरीका है? मैं .NET 2.0 पर हूं और 3.5 या 4.0 पर जाने का विकल्प नहीं है।

राय का स्वागत है।

+0

मुझे लगता है कि enums स्ट्रिंग में परिवर्तित किया जा रहा है, मुझे लगता है कि एक स्ट्रिंग को एक emum में पार्स किया जा रहा है। आप क्या कर रहे हैं, आप सही तरीके से कर रहे हैं, लेकिन आपका लक्ष्य क्या है? –

+0

@ रोब इलियट - इनमें से कुछ चीजें एक स्ट्रिंग-आधारित डेटास्टोर (मेरी पसंद नहीं) में जा रही हैं और पढ़ी जाएंगी, इसलिए मुझे यह सुनिश्चित करने की ज़रूरत है कि मैं जो अपेक्षा करता हूं उसे वापस ले जाऊंगा। –

उत्तर

1

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

+0

मैंने कोशिश की, और आप बिल्कुल सही हैं। यदि आप अपने मूल्यों को सही तरीके से समूहित नहीं कर रहे हैं तो यह बहुत खतरनाक हो सकता है। –

3

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

+0

मैंने अभी कमांड लाइन तर्कों के साथ कुछ ऐसा किया है। मैं तर्क [2] देखकर थक गया, [3] तर्क देता है, इसलिए मैंने तर्क सूचकांक के लिए एक enum बनाया, इसलिए मैं सार्थक नाम प्रदान कर सकता था।मैं इस पोस्ट पर पहुंचा क्योंकि विभिन्न कमांड स्विच के लिए, एक ही इंडेक्स पर एक तर्क का एक अलग अर्थ था, इसलिए मैंने कुछ enum मानों को डुप्लिकेट करने के लिए समाप्त हो गया। – Triynko

5

यदि आपके पास झंडे enum है तो उपनाम enum मान प्रदान करना उपयोगी हो सकता है। जैसे

[Flags] 
enum Rows { 
    Even = 0x01, 
    Odd = = 0x02, 
    All = Even | Odd 
} 

हालांकि, अगर आप फ्रेमवर्क डिजाइन दिशानिर्देश Cwalina और अब्राम द्वारा में enums के लिए दिशानिर्देश पढ़ आप निम्नलिखित सलाह मिलेगी:

करते नहीं खुला सेट के लिए एक enum का उपयोग करें (जैसे ऑपरेटिंग सिस्टम संस्करण, आपके दोस्तों के नाम इत्यादि)।

और

न करें enums में प्रहरी मूल्यों शामिल हैं।

वर्तमान संस्करण एक सेंटीनेल मूल्य है।

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

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