.NET में, दो प्रकार की श्रेणियां हैं: संदर्भ और मान (इंट, डबल, स्ट्रक्चर्स, एनम आदि)। उनके अंतर के बीच यह तथ्य है कि एक संदर्भ हो सकता है null
, जबकि एक मूल्य नहीं हो सकता है। इस प्रकार यदि आपके पास एक मूल्य प्रकार है और "वैकल्पिक" या "अज्ञात" शब्दार्थ को व्यक्त करना चाहते हैं, तो आप इसके साथ सज सकते हैं Nullable<>
। ध्यान दें कि Nullable<>
केवल मूल्य प्रकार (यह एक where T : struct
खंड है) को स्वीकार करने के लिए प्रकार से विवश है । Nullable<>
संकलक से विशेष व्यय भी होता है जिससे null
मूल्य का संरक्षण किया जाता है NullReferenceExceptions
:
string x = null;
x.ToString(); // throws a NullReferenceException
int? y = null;
y.ToString(); // returns ""
कार्यात्मक भाषाओं (जैसे स्काला, एफ #, हास्केल, स्विफ्ट आदि) में यह आम बात है null
करने के लिए मौजूद नहीं । ऐसा इसलिए है क्योंकि पूरे लोग null
एक बुरे विचार के अस्तित्व को मानते हैं , और भाषा डिजाइनरों ने इसे अस्वीकार करके इस समस्या का समाधान करने का निर्णय लिया है।
इसका मतलब यह है कि फिर से हमें इन भाषाओं में एक गैर-मूल्य का प्रतिनिधित्व करने के लिए किसी तरह की आवश्यकता है । Option
प्रकार दर्ज करें (नामकरण भिन्न होता है, इसे Maybe
हास्केल में कहा जाता है)। यह इसी तरह का काम करता है Nullable
कि यह मामले को जोड़ने के लिए एक प्रकार लपेटता है जहां मान "कोई नहीं" या "अज्ञात" आदि है।
वास्तविक अंतर आपको लागू होने वाली भाषाओं द्वारा दिए गए अतिरिक्त कार्यों में है Option
। एक उदाहरण के रूप में, Option.map
(छद्मकोश में) लें:
function Option<T2> Option.map(opt: Option<T1>, mapFunc: T1 -> T2) {
if (opt is None) return None
else return Option<T2>(mapFunc(opt.Value))
}
चाइनिंग फ़ंक्शंस, Option.map
सी # में हर जगह दिखने वाले विशिष्ट नल चेक बॉयलर से बचने का एक शक्तिशाली तरीका है:
if (service == null)
return null;
var x = service.GetValue();
if (x == null || x.Property == null)
return null;
return x.Property.Value;
C # में अशक्त समकक्ष होगा:
public static Nullable<T2> Map<T1, T2>(this Nullable<T1> nullable, Func<T1, T2> f)
where T1 : struct
where T2 : struct
{
if (!nullable.HasValue) return (T2?)null;
else return (T2?) f(nullable.Value);
}
हालाँकि C # में इसकी सीमित उपयोगिता है क्योंकि यह केवल मूल्य प्रकारों के लिए काम करेगा।
C # का नया संस्करण "शून्य प्रसार" ऑपरेटर ( ?.
) प्रदान करता है जो Option.map
फ़ंक्शन के समान है, सिवाय इसके कि यह केवल विधियों और संपत्ति अभिगमकर्ताओं के लिए लागू हो। उपरोक्त नमूने को फिर से लिखा जाएगा
return service?.GetValue()?.Property?.Value;