2012-02-03 15 views
13

भेदभाव मैं सिर्फ देखा है वहाँ केवल एक गैर-सदस्य संघ भेदभाव की घोषणा में एक छोटे से अंतर है कि:Enum बनाम गैर-सदस्य संघ

type Color = 
    | Red 
    | Green 
    | Blue 

और एक enum की घोषणा:

type Color = 
    | Red = 0 
    | Green = 1 
    | Blue = 2 

क्या प्रदर्शन, उपयोग, आदि के मामले में उनके मुख्य मतभेद हैं? क्या आपके पास सुझाव देने के लिए सुझाव हैं?

उत्तर

14

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

अधिक महत्वपूर्ण रूप से एक भेदभाव संघ कभी भी घोषित प्रकारों में से एक हो सकता है, जहां enums वास्तव में केवल एक पूर्णांक हैं, इसलिए आप एक पूर्णांक डालें जो enum प्रकार के enum का सदस्य नहीं है। इसका मतलब यह है कि जब संकलक से मिलान करने वाला पैटर्न यह कह सकता है कि जब आप डीयू के लिए सभी मामलों को कवर करते हैं तो पैटर्न मिलान पूरा हो जाता है, लेकिन एक enum के लिए आपको हमेशा एक बाकी को पकड़ने के लिए डिफ़ॉल्ट स्थिति में रखना होगा, यानी एक enum के लिए हमेशा पैटर्न मिलान की आवश्यकता होगी:

match enumColor with 
| Red -> 1 
| Green -> 2 
| Blue -> 3 
| _ -> failwith "not an enum member" 

जहां अंतिम मामला डीयू के साथ आवश्यक नहीं होगा।

एक अंतिम बिंदु, क्योंकि एनम्स दोनों सी # और वीबीएनईटी में मूल रूप से समर्थित हैं, डीयू नहीं हैं, अन्य भाषाओं द्वारा खपत के लिए सार्वजनिक एपीआई बनाते समय enums अक्सर बेहतर विकल्प होते हैं।

6

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

enums के अंतर्निहित "अपूर्णता" के संबंध में, जब एक पैटर्न मैच वास्तव में जानना चाहता है कि आप वास्तव में जानना चाहते हैं कि एक वैध मामला मैच द्वारा कवर नहीं किया गया था। यदि आप एनम में एक अमान्य पूर्णांक मान डाला गया था तो आप आमतौर पर परवाह नहीं करते हैं। उस स्थिति में आप मैच विफल होना चाहते हैं। मैं लगभग हमेशा संघों को पसंद करता हूं, लेकिन जब मुझे अनिवार्य वाइल्डकार्ड मामले के अंदर enums (आमतौर पर इंटरऑपरेबिलिटी के लिए) का उपयोग करना होता है, तो मैं बेजोड़ मान a function that distinguishes between valid and invalid values पर पास करता हूं और उचित त्रुटि उठाता हूं।

0

एफ # 4.1 के रूप में struct discriminated unions हैं।

इनके पास स्टैक आवंटन, जैसे कि एनम्स के प्रदर्शन लाभ हैं।

उनके पास भेदभाव वाले संघों का बेहतर मिलान है।

वे एफ # विशिष्ट हैं इसलिए यदि आपको अन्य .NET भाषाओं द्वारा समझने की आवश्यकता है तो आपको अभी भी enums का उपयोग करना चाहिए।