2012-06-21 12 views
9

एफ # मंत्र में null, Nullable<T> और इसके जैसे एक आंत से बचने लगता है। बदले में, हम विकल्प विकल्पों का उपयोग करने के लिए माना जाता है। ईमानदार होने के लिए, मुझे वास्तव में अंतर दिखाई नहीं देता है।विकल्प प्रकार और एक शून्य प्रकार के बीच क्या अंतर है?

  • एफ # विकल्प प्रकार के मेरे समझ है कि यह आपको एक प्रकार है जो अपनी सामान्य मूल्यों, या None के किसी भी शामिल कर सकते हैं निर्दिष्ट करने के लिए अनुमति देता है। उदाहरण के लिए, Option<int> के अतिरिक्त int के सभी मानों को अनुमति देता है।

  • सी # शून्य प्रकारों की मेरी समझ यह है कि यह आपको एक प्रकार निर्दिष्ट करने की अनुमति देता है जिसमें इसके सामान्य मान, या null शामिल हो सकते हैं। उदाहरण के लिए, Nullable<int> a.k.a int?null के अतिरिक्त int के सभी मानों को अनुमति देता है।

क्या अंतर है? Nullable और Option, null और None के साथ कुछ शब्दावली प्रतिस्थापन करें, और मूल रूप से वही बात है। null पर सभी झगड़े क्या हैं?

+2

यह यथासंभव जल्दी से तर्क त्रुटियों से परहेज करने के बारे में है - 'विकल्प' के साथ, आपको 'कोई नहीं' की जांच करने में विफल होने के लिए एक कंपाइलर चेतावनी/त्रुटि मिलती है; 'शून्य' के साथ आप नहीं करते हैं। – ildjarn

+0

तो सिद्धांत में यदि पैटर्न मिलान के साथ सी # था तो यह सुनिश्चित किया गया कि आपने 'शून्य' केस संभाला है, तो यह धो होगा? –

+0

आईएमओ, काफी ज्यादा, हालांकि अन्य लोग 'शून्य' की _semantic_ संवेदनशीलता के बारे में अन्यथा बहस करेंगे। – ildjarn

उत्तर

16

एफ # विकल्प सामान्य हैं,:

इसके अलावा इस जवाब को पढ़ने के लिए सुनिश्चित करें।

Nullable<T> एक बेहद अजीब प्रकार है; आप इसे केवल structs पर लागू कर सकते हैं, और हालांकि Nullable प्रकार स्वयं एक संरचना है, इसे स्वयं पर लागू नहीं किया जा सकता है। तो आप Nullable<Nullable<int>> नहीं बना सकते हैं, जबकि आप Option<Option<int>> बना सकते हैं। Nullable के लिए यह काम करने के लिए उन्हें कुछ ढांचा जादू करना पड़ा। किसी भी मामले में, इसका मतलब है कि Nullables के लिए, यदि आप एक वर्ग या संरचना है, तो आपको प्राथमिकता जाननी होगी, और यदि यह कक्षा है, तो आपको केवल शून्य के बजाए शून्य का उपयोग करने की आवश्यकता है। यह एक बदसूरत रिसाव अमूर्त है; यह मुख्य मान डेटाबेस इंटरऑप के साथ प्रतीत होता है, क्योंकि मुझे लगता है कि डेटाबेस डोमेन में निपटने के लिए 'int, या कोई मान' ऑब्जेक्ट होना आम बात है।

मेरी राय, नेट फ्रेमवर्क केवल एक बदसूरत गड़बड़ है जब यह शून्य और Nullable की बात आती है। आप तर्क दे सकते हैं कि Option होने से F # 'गड़बड़ में जोड़ता है, या यह आपको यह बताकर गड़बड़ी से बचाता है कि आप केवल शून्य/Nullable से बचें (जब इंटरऑप के लिए बिल्कुल आवश्यक को छोड़कर) और Option के साथ स्वच्छ समाधान पर ध्यान दें रों। आप दोनों राय के साथ लोगों को पा सकते हैं।

तुम भी

Best explanation for languages without null

+0

_why_ F # जोड़ता है 'विकल्प <_>' के जवाब में यह 'शून्य' 'शून्य' से गहराई से बंधे हैं, जो F # विचार से हटाने का प्रयास करता है। – Daniel

+0

@ डैनियल, और भी, 'विकल्प' एमएल/ओकैमल से आता है, और एफ # ओकैमल-कॉम्पैट से पैदा हुआ था। लेकिन हां, अधिकांश भाग के लिए, एफ # केवल 'नेट इंटरऑप' परिदृश्यों के लिए शून्य को रेखांकित करने की कोशिश करता है। – Brian

0

अच्छा, एक अंतर यह है कि Nullable<T> के लिए, टी केवल एक संरचना हो सकती है जो नाटकीय रूप से उपयोग मामलों को कम कर देती है। आप किसी भी प्रकार के 'T के लिए Option<'T> बना सकते हैं https://stackoverflow.com/a/947869/288703

2

लाभ को देखने के लिए का उपयोग कर option है कि यह स्पष्ट करता है कि एक चर का कोई मूल्य नहीं हो सकते हैं, जबकि नल प्रकार यह अंतर्निहित छोड़ कर सकते हैं।यह देखते हुए की तरह एक परिभाषा:

string val = GetValue(object arg); 

प्रकार प्रणाली दस्तावेज़ नहीं पड़ता कि वैल कभी अशक्त हो सकता है, या यदि आर्ग रिक्त है कि क्या होगा। इसका मतलब है कि कॉलर और कैली की धारणाओं को सत्यापित करने के लिए कार्य सीमाओं पर दोहराव की जांच की जानी चाहिए।

let f (io: int option) = function 
| Some i -> i 
5

हर नेट संदर्भ प्रकार यह हो सकता है क्योंकि:

पैटर्न मिलान, विकल्प प्रकार का उपयोग कर स्थिर दोनों ही मामलों सुनिश्चित करने के लिए जाँच की जा सकती कोड नियंत्रित किया जाता है, उदाहरण के लिए एक चेतावनी में निम्न कोड परिणामों के साथ

अतिरिक्त, अर्थहीन मूल्य-चाहे वह शून्य है, संभावना मौजूद है और आपको इसकी जांच करनी चाहिए- और Nullablenull का उपयोग "कुछ भी नहीं" के रूप में करता है, मुझे लगता है कि यह सब कुछ खत्म करने के लिए बहुत समझदारी बनाता है अजीबता (जो एफ # करता है) और स्पष्ट होने के लिए "कुछ नहीं" की संभावना की आवश्यकता होती है। Option<_> वह करता है।

4

क्या अंतर है?

एफ #, आप चुनते हैं, या नहीं, आप अपने प्रकार एक option प्रकार और होना चाहते हैं जब आप अपना काम करने दिया None के लिए जाँच करने के लिए प्रोत्साहित करती है और उपस्थिति या None प्रकार में स्पष्ट की अनुपस्थिति बनाता है।

सी # null को अनुमति देने के लिए हर संदर्भ प्रकार को मजबूर करता है और आपको null की जांच करने के लिए प्रोत्साहित नहीं करता है।

तो यह केवल डिफ़ॉल्ट में एक अंतर है।

नलबल और विकल्प, शून्य और कोई नहीं के साथ कुछ शब्दावली प्रतिस्थापन करें, और मूल रूप से वही बात है। नल के बारे में सब झगड़ा क्या है?

एसएमएल, OCaml और हास्केल जैसी भाषाओं से पता चला है के रूप में, null को हटाने के वास्तविक कोड से चलाने के समय त्रुटियों की एक बहुत कुछ को हटा। इस सीमा तक कि null के मूल निर्माता ने इसे "billion dollar mistake" के रूप में भी वर्णित किया है।

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