2010-12-17 14 views
27

एफ # में यह एक बड़ा सौदा है कि उनके पास शून्य मान नहीं हैं और इसका समर्थन नहीं करना चाहते हैं। फिर भी प्रोग्रामर को सी # प्रोग्रामर के समान किसी के लिए केस नहीं करना पड़ता है! = शून्य।कोई भी शून्य से कम बुराई नहीं है?

कोई भी वास्तव में शून्य से कम बुराई नहीं है?

+6

यह ज़ेन पर एक पुस्तक का शीर्षक हो सकता है! – TechNeilogy

+2

निश्चित रूप से 'प्रकार bool = True | से बेहतर है। झूठा | FileNotFound' – Juliet

+0

यह भी देखें http://stackoverflow.com/questions/3989264/best-explanation-for-languages-without-null – Brian

उत्तर

30

बेशक यह कम बुराई है!

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

उदाहरण के लिए:

let myObject : option<_> = getObjectToUse() // you get a Some<'T>, added explicit typing for clarity 
match myObject with 
| Some o -> o.DoSomething() 
| None -> ... // you have to explicitly handle this case 

यह अभी भी सी # की तरह व्यवहार प्राप्त करने के लिए संभव है, लेकिन यह कम सहज है, के रूप में आप स्पष्ट रूप से कहने के लिए "उपेक्षा है कि इस से कोई भी हो सकता है" है:

let o = myObject.Value // throws NullReferenceException if myObject = None 

सी # में, आपको अपने चर के मामले को शून्य के मामले पर विचार करने के लिए मजबूर नहीं किया जाता है, इसलिए यह संभव है कि आप बस चेक करना भूल जाएं। एक ही उदाहरण के रूप में ऊपर:

var myObject = GetObjectToUse(); // you get back a nullable type 
myObject.DoSomething() // no type error, but a runtime error 

संपादित: स्टीफन Swensen बिल्कुल सही है, मेरे उदाहरण कोड कुछ खामियां थीं, जल्दी में यह लिख रहा था। फिक्स्ड। धन्यवाद!

+0

यहां तक ​​कि सी # में आपको रीशेर्पर में चेतावनियां मिलेंगी यदि आप शून्य – JoelFan

+1

@ करलो वी डैंगो, @ स्प्लाशहिट की जांच नहीं करते हैं, तो विकल्प प्रकार के साथ काम करते समय आपके पास बहुत ही विश्वसनीय तरीके हैं। मैप और ऑप्शन.बिंड, प्लस यह आपको मजबूर करता है किसी के साथ सौदा और इसके बारे में कारण। यदि आप बाइनरी कुछ (कुछ) या कोई नहीं (कुछ नहीं) की तुलना में अधिक परिणाम प्राप्त करना चाहते हैं, तो आप आसानी से अपने कोड को एक सुरक्षित तरीके से बढ़ा सकते हैं। – jlezard

+0

@SplashHit: सी # के साथ, आपको शून्य जांच के प्रबंधन के लिए अतिरिक्त (बाहरी) सहायता चाहिए। एफ # के साथ, विकल्प प्रकार भाषा का यह हिस्सा बनाता है। – pblasucci

34

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

'a option होने के नाते हमेशा एक स्पष्ट बात है। आप बताते हैं कि एक ऑपरेशन या तो Some सार्थक मूल्य या None उत्पन्न कर सकता है, जो संकलक को सही ढंग से जांच और संसाधित करने के लिए लागू कर सकता है।

को 'a option-प्रकार के पक्ष में हतोत्साहित करके, आप मूल रूप से गारंटी देते हैं कि आपके प्रोग्राम में कोई भी मूल्य किसी भी तरह का सार्थक है। यदि कुछ कोड इन मानों के साथ काम करने के लिए डिज़ाइन किए गए हैं, तो आप केवल अमान्य लोगों को पास नहीं कर सकते हैं, और यदि option -type का कोई फ़ंक्शन है, तो आप सभी संभावनाओं को कवर करने के लिए करेंगे।

val getPersonByName : (name : string) -> Person 

क्या आपको लगता है होता है जब आप एक व्यक्ति जो डेटा संग्रह में मौजूद नहीं है की एक name में पारित करते हैं:

+2

हटा दिया गया यह उत्तर स्वीकार्य एक आईएमओ (हालांकि दोनों महान हैं) से कहीं अधिक बेहतर है। ShdNx का जवाब इस बात से संबंधित है कि विकल्प क्यों अच्छे हैं लेकिन यह वास्तव में इसे शून्य से तुलना करता है और उत्तर देता है कि यह वास्तव में कम बुराई कैसे है (और यहां तक ​​कि शानदार!)। इच्छा है कि मैं इसे दूसरी बार वोट दे सकता हूं; धन्यवाद डारियो! – MasterMastic

14

चलो कहते हैं कि मैं तुम्हें इस तरह एक समारोह परिभाषा दिखाने दें?

  • क्या फ़ंक्शन एक नोटफॉउंड अपवाद फेंकता है?
  • क्या यह शून्य हो जाता है?
  • क्या यह व्यक्ति बना देता है यदि वे मौजूद नहीं हैं?

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

अब मान लीजिए कि आप के बजाय इस हस्ताक्षर के साथ एक समारोह डालते हैं:

val getPersonByName : (name : string) -> option<Person> 

इस परिभाषा में आता है यह बहुत स्पष्ट है कि क्या होता: आप या तो हूँ एक व्यक्ति वापस पाने के प्राप्त हो या नहीं, और इस तरह की जानकारी फ़ंक्शन के डेटा प्रकार में संप्रेषित की जाती है। आमतौर पर, आपके पास संभावित रूप से शून्य मान की तुलना में विकल्प प्रकार के दोनों मामलों को संभालने की बेहतर गारंटी है।

मैं कहूंगा कि विकल्प प्रकार नल की तुलना में अधिक उदार हैं।

+1

एफ # में एक अपवाद भी फेंक दिया जा सकता है इस तरह की एक समारोह घोषणा –

3

In F# its a big deal that they do not have null values and do not want to support it. Still the programmer has to make cases for None similar to C# programmers having to check != null.

Is None really less evil than null?

null जबकि रन-टाइम त्रुटि (NullRefereceException) हर बार जब आप सी #, None बलों में एक वस्तु भिन्नता आप एफ # में स्पष्ट रन-टाइम त्रुटि के स्रोतों बनाने के लिए के संभावित स्रोतों का परिचय।

उदाहरण के लिए, एक दिया वस्तु पर GetHashCode लागू कारण बनता है सी # चुपचाप रन-टाइम त्रुटि का एक स्रोत इंजेक्षन करने के लिए:

class Foo { 
    int m; 
    Foo(int n) { m=n; } 
    int Hash() { return m; } 
    static int hash(Foo o) { return o.Hash(); } 
}; 

इसके विपरीत, एफ # में बराबर कोड null मुक्त होने की उम्मीद है:

type Foo = 
    { m: int } 
    member foo.Hash() = foo.m 

let hash (o: Foo) = o.Hash() 

तुम सच में एफ # में एक वैकल्पिक मूल्य चाहता था, तो आप option प्रकार का प्रयोग करेंगे और आप इसे स्पष्ट रूप से संभाल चाहिए या संकलक एक चेतावनी या त्रुटि दे देंगे:

let maybeHash (o: Foo option) = 
    match o with 
    | None -> 0 
    | Some o -> o.Hash() 

तुम अब भी प्रकार प्रणाली (जो इंटरॉप के लिए आवश्यक है) को धोखा देने से एफ # में NullReferenceException प्राप्त कर सकते हैं:

> hash (box null |> unbox);; 
System.NullReferenceException: Object reference not set to an instance of an object. 
    at Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicFunctions.UnboxGeneric[T](Object source) 
    at <StartupCode$FSI_0021>[email protected]() 
Stopped due to error 
संबंधित मुद्दे