2009-02-09 3 views
161

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

enum Orientation 
{ 
    None = -1, 
    North = 0, 
    East = 1, 
    South = 2, 
    West = 3 
} 

Orientation o; // Is 'North' by default. 
+0

आप डिफ़ॉल्ट valu को बदलने में सक्षम होना चाहिए। ई int के लिए ई, डबल ?, आदि? –

उत्तर

278

एक enum के लिए डिफ़ॉल्ट (वास्तव में, किसी भी मान प्रकार) 0 है - भले ही है कि उस enum लिए एक मान्य मान नहीं है। इसे बदला नहीं जा सकता है।

+12

यह पूछने के लिए प्रश्न दोहराएं कि int के लिए डिफ़ॉल्ट मान 42 है। सोचें कि कितना दफ़्तर लगता है ... इसे प्राप्त करने से पहले मेमोरी * रनटाइम * खाली हो जाती है, enums structs – ShuggyCoUk

+3

@DougS 1 याद रखें।नहीं, लेकिन आप स्वीकार कर रहे थे गलत था। 2. उन्होंने टिप्पणी अपवॉट से कोई प्रतिष्ठा नहीं कमाई। –

+7

टिप्पणियों ने मुझे इस उत्तर के बारे में संदिग्ध बना दिया, इसलिए मैंने इसका परीक्षण किया और सत्यापित किया कि यह उत्तर निश्चित रूप से सही है। –

16

एक एनम का डिफ़ॉल्ट जो भी समीकरण शून्य के बराबर है। मुझे विश्वास नहीं है कि यह विशेषता या अन्य माध्यमों द्वारा बदला जा सकता है।

(MSDN कहते हैं: "। एक enum ई का डिफ़ॉल्ट मान अभिव्यक्ति (ई) 0 द्वारा उत्पादित मूल्य है")

+12

कड़ाई से, इस मूल्य के साथ एक गणना होने की भी आवश्यकता नहीं है। शून्य अभी भी डिफ़ॉल्ट है। –

6

वास्तव में एक enum के डिफ़ॉल्ट enum में पहला तत्व जिसका मूल्य है 0

उदाहरण के लिए

तो:

public enum Animals 
{ 
    Cat, 
    Dog, 
    Pony = 0, 
} 
//its value will actually be Cat not Pony unless you assign a non zero value to Cat. 
Animals animal; 
+8

हालांकि, उस मामले में "टट्टू" आईएस "बिल्ली" (उदाहरण के लिए, 'कंसोल। राइटलाइन (पशु। पोनी);' प्रिंट्स "बिल्ली") –

+14

दरअसल आपको या तो किसी भी मान को निर्दिष्ट नहीं करना चाहिए या सभी मान निर्दिष्ट करना होगा या केवल निर्दिष्ट करना होगा पहले परिभाषित सदस्य का मूल्य। यहां क्या होता है कि: बिल्ली का कोई मूल्य नहीं है और यह पहला मान है, इसलिए स्वचालित रूप से इसे 0 पर सेट करता है। कुत्ते के पास कोई मान नहीं है, स्वचालित रूप से इसे पिछला वैल्यू + 1 यानी 1 पर सेट करता है। Poney का मान होता है, मान छोड़ दें। तो बिल्ली = टट्टू = 0, कुत्ता = 1. यदि आपके पास {बिल्ली, कुत्ता, टट्टू = 0, मेंढक} है तो कुत्ता = मेंढक = 1. – user276648

8

आप नहीं कर सकते हैं, लेकिन अगर आप चाहते हैं, तो आप कुछ चाल कर सकते हैं। :) इस के

public struct Orientation 
    { 
     ... 
     public static Orientation None = -1; 
     public static Orientation North = 0; 
     public static Orientation East = 1; 
     public static Orientation South = 2; 
     public static Orientation West = 3; 
    } 

उपयोग के रूप में सरल enum struct।
जहां प्रति वर्ष बना सकते हैं == Orientation.East (या किसी भी मूल्य है कि आप चाहते हैं) डिफ़ॉल्ट
द्वारा चाल में ही उपयोग करने के लिए, आप कोड द्वारा पूर्णांक से बदलना होगा। वहाँ कार्यान्वयन
:

 #region ConvertingToEnum 
     private int val; 
     static Dictionary<int, string> dict = null; 

     public Orientation(int val) 
     { 
      this.val = val; 
     } 

     public static implicit operator Orientation(int value) 
     { 
      return new Orientation(value - 1); 
     } 

     public static bool operator ==(Orientation a, Orientation b) 
     { 
      return a.val == b.val; 
     } 

     public static bool operator !=(Orientation a, Orientation b) 
     { 
      return a.val != b.val; 
     } 

     public override string ToString() 
     { 
      if (dict == null) 
       InitializeDict(); 
      if (dict.ContainsKey(val)) 
       return dict[val]; 
      return val.ToString(); 
     } 

     private void InitializeDict() 
     { 
      dict = new Dictionary<int, string>(); 
      foreach (var fields in GetType().GetFields(BindingFlags.Public | BindingFlags.Static)) 
      { 
       dict.Add(((Orientation)fields.GetValue(null)).val, fields.Name); 
      } 
     } 
     #endregion 
+0

अपने अंतर्निहित रूपांतरण ऑपरेटर में आपको 'मूल्य + 1' की आवश्यकता है, अन्यथा अब आपका' डिफ़ॉल्ट (ओरिएंटेशन) 'रिटर्न' ईस्ट'। इसके अलावा, कन्स्ट्रक्टर निजी बनाओ। अच्छी एप्रोच। – nawfal

53

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

enum Orientation 
{ 
    None = 0, //default value since it has the value '0' 
    North = 1, 
    East = 2, 
    South = 3, 
    West = 4 
} 

Orientation o; // initialized to 'None' 

अपने प्रगणक स्पष्ट मान की जरूरत नहीं है, तो बस यकीन है कि पहले प्रगणक एक आप के बाद से "डिफ़ॉल्ट रूप से, पहले प्रगणक मान 0 है डिफ़ॉल्ट प्रगणक होना चाहता हूँ, और मूल्य है प्रत्येक क्रमिक गणनाकर्ता की वृद्धि 1 से बढ़ी है। " (C# reference)

enum Orientation 
{ 
    None, //default value since it is the first enumerator 
    North, 
    East, 
    South, 
    West 
} 

Orientation o; // initialized to 'None' 
-5
[DefaultValue(None)] 
public enum Orientation 
{ 
    None = -1, 
    North = 0, 
    East = 1, 
    South = 2, 
    West = 3 
} 

तब कोड में आप उपयोग कर सकते

public Orientation GetDefaultOrientation() 
{ 
    return default(Orientation); 
} 
+14

/! \ WRONG /! \ DefaultValueAttribute वास्तव में मान निर्धारित नहीं करता है, यह केवल जानकारी उद्देश्यों के लिए है। फिर यह जांचने के लिए आप पर निर्भर है कि आपका enum, फ़ील्ड, संपत्ति, ... क्या विशेषता है। PropertyGrid इसका उपयोग करता है ताकि आप दायाँ क्लिक कर सकें और "रीसेट" का चयन कर सकें, भले ही आप डिफ़ॉल्ट मान का उपयोग नहीं कर रहे हैं, पाठ बोल्ड में दिखाया गया है - लेकिन - आपको अभी भी अपनी संपत्ति को डिफ़ॉल्ट मान पर मैन्युअल रूप से सेट करना होगा। – user276648

2

डिफ़ॉल्ट परिभाषा में पहली एक है।उदाहरण के लिए:

public enum MyEnum{His,Hers,Mine,Theirs} 

Enum.GetValues(typeOf(MyEnum)).GetValue(0); 

यह वापस आ जाएगी His

+0

यह सटीक नहीं है - डिफ़ॉल्ट शून्य परिभाषित मान है। केवल तभी जब शून्य मान स्पष्ट रूप से परिभाषित नहीं किया जाता है, ऐसा होता है कि पहला मान वह भी होता है जो संख्यात्मक मान शून्य प्राप्त करता है। –

+0

हां यह सटीक है, यह बिल्कुल सटीक नहीं है। फिर एक और जवाब जोड़ें, शीश। –

29

शून्य उचित डिफ़ॉल्ट मान के रूप में काम नहीं करता, तो आप enum के लिए एक समाधान को परिभाषित करने के घटक मॉडल का उपयोग कर सकते हैं:

[DefaultValue(None)] 
public enum Orientation 
{ 
    None = -1, 
    North = 0, 
    East = 1, 
    South = 2, 
    West = 3 
} 

public static class Utilities 
{ 
    public static TEnum GetDefaultValue<TEnum>() where TEnum : struct 
    { 
     Type t = typeof(TEnum); 
     DefaultValueAttribute[] attributes = (DefaultValueAttribute[])t.GetCustomAttributes(typeof(DefaultValueAttribute), false); 
     if (attributes != null && 
      attributes.Length > 0) 
     { 
      return (TEnum)attributes[0].Value; 
     } 
     else 
     { 
      return default(TEnum); 
     } 
    } 
} 

और फिर आप कॉल कर सकते हैं:

Orientation o = Utilities.GetDefaultValue<Orientation>(); 
System.Diagnostics.Debug.Print(o.ToString()); 

नोट: यदि आप भंडार की आवश्यकता होगी फ़ाइल के शीर्ष पर निम्न पंक्ति Ude:

using System.ComponentModel; 

यह वास्तविक सी # enum की भाषा डिफ़ॉल्ट मान नहीं बदलता है, लेकिन एक तरह से संकेत मिलता है (और प्राप्त) वांछित डिफ़ॉल्ट मान देता है।

+0

क्षमा करें यह आपके लिए काम नहीं करता है। क्या आप अधिक जानकारी जोड़ सकते हैं? आपको System.ComponentModel का उपयोग करके लाइन जोड़ने की आवश्यकता है; और उसके बाद Utilities क्लास में GetDefaultEnum() फ़ंक्शन लिखें। आप किस .NET का उपयोग कर रहे हैं? घटक मॉडल विशेषता और स्वच्छ समाधान के पुन: उपयोग के लिए – David

+2

+1। मैं आपको 'else' कथन में अंतिम पंक्ति को निम्नानुसार बदलने के लिए अनुशंसा करना चाहता हूं:' वापसी डिफ़ॉल्ट (TEnum); '। मुट्ठी, यह धीमी 'Enum.GetValues ​​(...) को कम करेगा। *** 'कॉल, दूसरा (और अधिक महत्वपूर्ण) यह किसी भी प्रकार के, यहां तक ​​कि गैर-enums के लिए सामान्य होगा। इसके अलावा, आप कोड को केवल enums के लिए उपयोग करने के लिए प्रतिबंधित नहीं करते हैं, इसलिए यह गैर-enum प्रकारों पर उपयोग किए जाने पर संभावित अपवादों को वास्तव में ठीक करेगा। –

+0

यह पूछे गए प्रश्न के संदर्भ में डिफ़ॉल्ट मान विशेषता का दुरुपयोग हो सकता है। सवाल पूछा गया स्वचालित रूप से प्रारंभिक मूल्य के बारे में है, जो प्रस्तावित समाधान के साथ नहीं बदलेगा। यह विशेषता विज़ुअल डिज़ाइनर के प्रारंभिक मान से भिन्न भिन्नता के लिए है। दृश्य डिजाइनर के सवाल पूछने वाले व्यक्ति द्वारा कोई उल्लेख नहीं है। –

6

एक और तरीका जो मददगार हो सकता है - किसी प्रकार का "उपनाम" का उपयोग करने के लिए। उदाहरण के लिए:

public enum Status 
{ 
    New = 10, 
    Old = 20, 
    Actual = 30, 

    // Use Status.Default to specify default status in your code. 
    Default = New 
} 
+1

सुझाव अच्छा है, हालांकि, जैसा कि पहले से ही अन्य उत्तरों में बताया गया है, गणनाओं का उनका डिफ़ॉल्ट मान शून्य होना है। आपके मामले में, अभिव्यक्ति 'स्थिति एस = डिफ़ॉल्ट (स्थिति);' स्थिति के सदस्यों में से कोई भी नहीं होगा, क्योंकि '' 'के पास' (स्टॉस) 0' का मान होगा। उत्तरार्द्ध सीधे लिखने के लिए मान्य है, क्योंकि enums को पूर्णांक में डाला जा सकता है, लेकिन यह deserialization के दौरान विफल हो जाएगा, क्योंकि ढांचे सुनिश्चित करता है कि एक enum हमेशा एक वैध सदस्य के लिए deserialized है। यदि आप 'नया = 10'' को नया = 0' में बदलते हैं तो आपका कोड पूरी तरह मान्य होगा। –

+1

हां। नया = 0 काम करेगा। मैं व्यक्तिगत रूप से enum सदस्यों को स्पष्ट रूप से स्थापित नहीं करने से बचाना होगा। –

2

The default value of enum is the enummember equal to 0 or the first element(if value is not specified) ... लेकिन मैं गंभीर समस्याओं अपनी परियोजनाओं में enum का उपयोग कर सामना करना पड़ा और नीचे कुछ कर रही ... कैसे कभी मेरी जरूरत श्रेणी स्तर से संबंधित था के द्वारा दूर किया है ...

class CDDtype 
    { 
     public int Id { get; set; } 
     public DDType DDType { get; set; } 

     public CDDtype() 
     { 
      DDType = DDType.None; 
     } 
    }  


    [DefaultValue(None)] 
    public enum DDType 
    {  
     None = -1,  
     ON = 0,  
     FC = 1,  
     NC = 2,  
     CC = 3 
    } 

और उम्मीद करने के परिणाम

CDDtype d1= new CDDtype(); 
    CDDtype d2 = new CDDtype { Id = 50 }; 

    Console.Write(d1.DDType);//None 
    Console.Write(d2.DDType);//None 
अब

क्या हुआ अगर मूल्य इस परिदृश्य में डीबी से आ रही है .... ठीक है ... समारोह नीचे में मूल्य गुजरती हैं और यह चुनाव होगा Enum vertthe मूल्य के लिए ... नीचे समारोह विभिन्न परिदृश्य संभाला और यह सामान्य है ... और विश्वास है मुझे यह बहुत तेजी से होता है ..... :)

public static T ToEnum<T>(this object value) 
    { 
     //Checking value is null or DBNull 
     if (!value.IsNull()) 
     { 
      return (T)Enum.Parse(typeof(T), value.ToStringX()); 
     } 

     //Returanable object 
     object ValueToReturn = null; 

     //First checking whether any 'DefaultValueAttribute' is present or not 
     var DefaultAtt = (from a in typeof(T).CustomAttributes 
          where a.AttributeType == typeof(DefaultValueAttribute) 
          select a).FirstOrNull(); 

     //If DefaultAttributeValue is present 
     if ((!DefaultAtt.IsNull()) && (DefaultAtt.ConstructorArguments.Count == 1)) 
     { 
      ValueToReturn = DefaultAtt.ConstructorArguments[0].Value; 
     } 

     //If still no value found 
     if (ValueToReturn.IsNull()) 
     { 
      //Trying to get the very first property of that enum 
      Array Values = Enum.GetValues(typeof(T)); 

      //getting very first member of this enum 
      if (Values.Length > 0) 
      { 
       ValueToReturn = Values.GetValue(0); 
      } 
     } 

     //If any result found 
     if (!ValueToReturn.IsNull()) 
     { 
      return (T)Enum.Parse(typeof(T), ValueToReturn.ToStringX()); 
     } 

     return default(T); 
    } 
+0

-1 जानबूझकर दिए गए प्रश्न का उत्तर नहीं देने के लिए। यह एक स्पष्ट होमवर्क समस्या नहीं है, जो एकमात्र मामला होना चाहिए जिसमें आप जानबूझकर जवाब नहीं देते हैं। – Xynariz

+0

@Xynariz .. क्षमा करें दोस्तों ..मेरी टिप्पणियां नकारात्मक रूप से नकारात्मक थीं क्योंकि मेरा असली इरादा किसी अन्य तरीके से समाधान प्रदान करना था ... इसलिए मैंने अपनी टिप्पणियां बदल दी ...: डी – Moumit

1

एक गणन प्रकार के लिए डिफ़ॉल्ट मान 0 है:

  • "डिफ़ॉल्ट रूप से, पहले प्रगणक मान 0 है, और प्रत्येक उत्तरोत्तर प्रगणक 1. की वृद्धि हुई है का महत्व है"

  • "मान प्रकार enum है अभिव्यक्ति (ई) 0 द्वारा उत्पादित मूल्य, जहां ई enum पहचानकर्ता है। "

आप सी # enum here के लिए दस्तावेज़, और सी # मूलभूत मूल्यों तालिका here

1

के दस्तावेज़ देखने कर सकते हैं सबसे छोटा मान आप इस का उपयोग कर सकते के साथ enum के रूप में डिफ़ॉल्ट enum निर्धारित करते हैं :

public enum MyEnum { His = -1, Hers = -2, Mine = -4, Theirs = -3 } 

var firstEnum = ((MyEnum[])Enum.GetValues(typeof(MyEnum)))[0]; 

firstEnum == Mine. 

यह स्वीकार नही करता enum एक शून्य मान है कि

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