2009-07-22 16 views
54

मैं एक संपत्ति है जो एक enum है के साथ एक वर्ग हैएक Enum की प्रारंभिक मूल्य

enum

/// <summary> 
/// All available delivery actions 
/// </summary> 
public enum EnumDeliveryAction 
    { 
    /// <summary> 
    /// Tasks with email delivery action will be emailed 
    /// </summary> 
    Email, 

    /// <summary> 
    /// Tasks with SharePoint delivery action 
    /// </summary> 
    SharePoint 
    } 

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

+0

Enum है एक मान प्रकार, के रूप में एक संदर्भ प्रकार का विरोध किया है। संदर्भ प्रकार को शून्य पर डिफॉल्ट किया जाएगा, जबकि, मान प्रकार को मान पर डिफ़ॉल्ट किया जाएगा। अर्थात। 0 से int डिफ़ॉल्ट, दिनांक दिनांक डिफ़ॉल्ट तिथि, आदि – contactmatt

उत्तर

103

enum प्रकारों के लिए डिफ़ॉल्ट मान 0 (जो डिफ़ॉल्ट रूप से, गणना में पहला तत्व है) है। किसी वर्ग के फ़ील्ड को डिफ़ॉल्ट मान में प्रारंभ किया जाएगा।

आप enum में एक अज्ञात मूल्य का प्रतिनिधित्व करने की जरूरत है, तो आप एक तत्व Unknown मूल्य 0. साथ वैकल्पिक रूप से जोड़ सकते हैं, तो आप Nullable<MyEnum> (MyEnum?) के रूप में क्षेत्र की घोषणा कर सकता है।

+0

तो क्या मुझे अपने enums के साथ पहली मान शुरू करने की आवश्यकता है? –

+0

उस पर ध्यान देने के लिए उत्तर अद्यतन किया गया है। –

+1

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

8

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

public class MyClass 
{ 
    public EnumDeliveryAction? DeliveryAction { get; set;} 
} 
+1

या एक अपरिभाषित सदस्य जोड़ें: सार्वजनिक enum EnumDeliveryAction {अपरिभाषित = 0, ईमेल = 1, शेयरपॉइंट = 2} –

+0

आप Nullable – Polaris878

+1

पोलारिस का भी उपयोग कर सकते हैं: 'Nullable ' 'टी 'के समान है। –

7

एनम फ़ील्ड शून्य के रूप में प्रारंभ किए गए हैं; यदि आप किसी enum में मान निर्दिष्ट नहीं करते हैं, तो वे शून्य (Email = 0, SharePoint=1, आदि) से शुरू होते हैं।

इस प्रकार डिफ़ॉल्ट रूप से आप जो भी फ़ील्ड शुरू करते हैं, वह Email होगा। ऐसे मामलों के लिए None=0 जोड़ने के लिए अपेक्षाकृत आम है, या वैकल्पिक रूप से Nullable<T> का उपयोग करें; अर्थात

/// <summary> 
/// All available delivery actions 
/// </summary> 
public enum EnumDeliveryAction 
{ 
    /// <summary> 
    /// Not specified 
    /// </summary> 
    None, 

    /// <summary> 
    /// Tasks with email delivery action will be emailed 
    /// </summary> 
    Email, 

    /// <summary> 
    /// Tasks with SharePoint delivery action 
    /// </summary> 
    SharePoint 
} 

आपको एक डिफ़ॉल्ट के रूप में अपने पिछले उम्मीद मूल्य का इलाज कभी नहीं करने के लिए सुनिश्चित होना चाहिए; यानी

switch(action) { 
    case EnumDeliveryAction.Email; RunEmail(); break; 
    default: RunSharePoint(); break; 
} 

इस होना चाहिए:

switch(action) { 
    case EnumDeliveryAction.Email; RunEmail(); break; 
    case EnumDeliveryAction.SharePoint; RunSharePoint(); break; 
    default: throw new InvalidOperationException(
      "Unexpected action: " + action); 
} 
0

मूल्यों कि आम तौर पर एक एक नल प्रकार के रूप में अपने चर घोषित करने के लिए है नहीं है तुम्हारे पास, यानी करने के लिए एक अशक्त जोड़ने के लिए पारंपरिक aproach:

EnumDeliveryAction? action=null; 
0

मैं आपके पहले enum मान के रूप में कोई नहीं = 0 का मान रखने का सुझाव दूंगा। इसे स्पष्ट बनाएं, फिर आप यह सुनिश्चित करने के लिए जानते हैं कि इसका मूल्य क्या है।

1

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

मैं आम तौर पर .NET Framework Design दिशानिर्देशों के अनुसार ऐसा करने के लिए पहली बार Enum (= 0) घोषित करता हूं।

6

सर्वोत्तम अभ्यास (कोड विश्लेषण द्वारा सलाह के अनुसार) हमेशा आपके enums में एक डिफ़ॉल्ट मान है, जो एक अनसेट मान का प्रतिनिधित्व करता है।

तो आपके मामले में, तुम हो सकता है:

public enum EnumDeliveryAction 
    { 

    /// <summary> 
    /// Default value 
    /// </summary> 
    NotSet, 

    /// <summary> 
    /// Tasks with email delivery action will be emailed 
    /// </summary> 
    Email, 

    /// <summary> 
    /// Tasks with SharePoint delivery action 
    /// </summary> 
    SharePoint 
    } 

एक के रूप में अलग रूप में, आप Enum साथ enum के नाम उपसर्ग नहीं करना चाहिए। आप इसे बदलने पर विचार कर सकते हैं:

public enum DeliveryAction; 
+0

मुझे यकीन नहीं है कि मैं .NET में एक "अपरिभाषित" enum सदस्य जोड़ने के साथ सहमत हूं क्योंकि यह परिभाषा के द्वारा शून्य का मतलब है - अज्ञात। आपके द्वारा बनाए गए हर enum में शून्य को फिर से परिभाषित करने के लिए अनावश्यक लगता है। –

+1

मुझे लगता है कि आपके enum में एक डिफ़ॉल्ट मान होने के कारण nullable enums का उपयोग करने से एक बेहतर अभ्यास है। – Tim

0

डिफ़ॉल्ट रूप से केवल संदर्भ प्रकार शून्य प्रकार हैं। यदि आप एक चर को नल की अनुमति देने के लिए चाहते हैं तो आपको इसे "?" का उपयोग करके निरर्थक रूप से परिभाषित करना होगा चरित्र (इसके लिए आपको सी # 2.0 या ऊपर की आवश्यकता है)।

enum MyEnum 
{ 
    ValueOne, 
    ValueTwo 
} 

और अपनी कक्षा

MyEnum? myvariable = null; 
+0

मुझे लगता है कि आपका मतलब है कि केवल * संदर्भ प्रकार * डिफ़ॉल्ट रूप से शून्य हैं, क्योंकि दोनों संदर्भ और मान प्रकारों को .NET – PatrickJ

+0

में ऑब्जेक्ट माना जाता है, यही मेरा मतलब है: डी –

3

Enums में मूल्य प्रकार हैं। मूल्य प्रकार नल नहीं हो सकता और 0.

के लिए शुरू कर रहे हैं यहां तक ​​कि अगर आपके enum एक 0 नहीं है, enum चर 0.

public enum SomeEnum 
{ 
    A = 1, 
    B = 2 
} 

(बाद में)

SomeEnum x = default(SomeEnum); 
Console.WriteLine(x); 

के लिए शुरू हो जाएगा आउटपुट - 0


कुछ answerers अपने मैं मैच के लिए Nullable<T> का उपयोग कर वकालत कर रहे हैं प्रारंभिक उम्मीदें इस सलाह के साथ बनने के बाद Nullable<T> अभी भी एक मान प्रकार है और संदर्भ प्रकारों की तुलना में अलग-अलग अर्थशास्त्र है। उदाहरण के लिए, यह कभी भी एक शून्य संदर्भ अपवाद उत्पन्न नहीं करेगा (यह संदर्भ नहीं है)।

SomeEnum? x = default(SomeEnum?); 

if (x == null) 
{ 
    Console.WriteLine("It's null!"); 
} 
if (x > SomeEnum.B) 
{ 
} 
else 
{ 
    Console.WriteLine("This runs even though you don't expect it to"); 
} 
0

मेरे सी ++ कॉलेज में शिक्षक (11 साल पहले) ने मुझे बताया कि लिंकर उनकी वास्तविक प्रकार के साथ enum की जगह:

typedef static const int enum;

इस प्रकार, किसी भी समय आप enum MY_VAL = 5; की तरह कुछ है, तो आप कर सकते थे बारे में आसानी से static const int MY_VAL = 5; के साथ प्रतिस्थापित करें (लेकिन यह सिर्फ आपके कोड को लंबा बनाता है ...)।

वैसे भी, किसी भी int का डिफ़ॉल्ट मान 0.

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