2012-08-12 4 views
6

यह downvoted हो सकता है, लेकिन इस सवाल का कल से मुझे परेशान कर दिया गया है .. जब तक मैं एक लिंक मिल गया तो मैं जानता था कि मैं सच में पागल lol नहीं था: Enum as instance variablesहम सी # में एनम उदाहरण से enum मानों का उपयोग क्यों नहीं कर सकते?

मैं मूल रूप से ओ पी के विपरीत पूछ रहा हूँ सवाल। यह देखते हुए:

enum Coffee { 
    BIG, 
    SMALL } 

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

इस हालांकि जावा और enums दोनों भाषाओं में कुछ अलग करना है कैसे है यह है कि मैं coffee.BIG या coffee.BIG.SMALL (हालांकि यह थोड़ा समझ में आता है जब इसे पढ़ने के लिए नहीं कर सकते, कॉफी के प्रकार कॉफी पर विचार करना संभव होना चाहिए) सी # में?

उत्तर

10

यह वास्तव में enums से कोई लेना देना नहीं है। यह आम तौर पर स्थिर सदस्यों तक पहुंचने के साथ करना है।

जावा में एक डिज़ाइन दोष (आईएमओ) है जो आपको स्थिर सदस्यों तक पहुंचने की अनुमति देता है जैसे कि वे उस प्रकार की अभिव्यक्ति के माध्यम से उदाहरण सदस्य थे। यह बहुत कोड भ्रमित करने के लिए नेतृत्व कर सकते हैं:

Thread thread = new Thread(...); 
thread.start(); 
// This looks like it makes the new thread sleep, but it actually makes the 
// current thread sleep 
thread.sleep(1000); 

इसके अतिरिक्त, अभिव्यक्ति की मूल्य के रूप में कोई तुच्छता की जांच कर रहा है अप्रासंगिक:

Thread thread = null; 
thread.sleep(1000); // No exception 

अब, विचार है कि enum मूल्यों परोक्ष स्थिर हैं , और आप देख सकते हैं कि अंतर क्यों है।

सच है कि आप स्वीकार कर लिया है कि कि "यह थोड़ा समझ में आता है, जब यह पढ़ने" पता चलता है कि दिल में आप सहमत हैं कि इस जावा में एक दोष है, के भीतर नहीं सी # :)

+0

ओह हाँ, यह अब पूरी समझ में आता है। अंत में एक जवाब! : पी –

4

सी # (जावा के विपरीत) में उस वर्ग के उदाहरण के माध्यम से स्थिर क्षेत्र तक पहुंचना कानूनी नहीं है।

यदि आप लिखना इस:

coffee.BIG.SMALL 

तो त्रुटि आप प्राप्त है:

सदस्य 'coffee.SMALL' एक उदाहरण संदर्भ से नहीं पहुंचा जा सकता है; एक प्रकार का नाम बजाय

इस कोड को भी एक ही कारण के लिए काम नहीं करेगा साथ यह अर्हता:

void Foo(coffee c) 
{ 
    // Member 'coffee.SMALL' cannot be accessed with an instance reference 
    Console.WriteLine(c.SMALL); 
} 
+3

+1 और अपने सादे भ्रामक जावा। –

+0

सही समझ में आता है, धन्यवाद :) –