अपडेट: विज़ुअल स्टूडियो 2015 के साथ शुरू, सी # संकलक (भाषा संस्करण 6) अब ?.
ऑपरेटर को पहचानता है , जो एक हवा को "गहरी नल की जाँच" करता है। देखें इस उत्तर जानकारी के लिए।
आपके कोड को फिर से डिज़ाइन करने के अलावा, इस हटाए गए उत्तर की तरह
, एक और (यद्यपि भयानक) विकल्प यह try…catch
देखने NullReferenceException
के लिए कि गहरी संपत्ति देखने के दौरान कुछ समय बाद होता है, एक ब्लॉक का उपयोग करना होगा ।
try
{
var x = cake.frosting.berries.loader;
...
}
catch (NullReferenceException ex)
{
// either one of cake, frosting, or berries was null
...
}
मैं निम्नलिखित कारणों से व्यक्तिगत रूप से ऐसा नहीं करूंगा:
- यह अच्छा नहीं लगता है।
- यह अपवाद से निपटने का उपयोग करता है, जो असाधारण स्थितियों को लक्षित करना चाहिए और ऐसा कुछ नहीं जिसे आप ऑपरेशन के सामान्य पाठ्यक्रम के दौरान अक्सर होने की उम्मीद करते हैं।
NullReferenceException
s को कभी भी स्पष्ट रूप से नहीं पकड़ा जाना चाहिए। ( यह सवाल देखें ।)
तो क्या कुछ विस्तार विधि का उपयोग करना संभव है या यह एक भाषा सुविधा होगी, [...]
यह लगभग निश्चित रूप से एक भाषा सुविधा होगी (जो कि .?
और ?[]
ऑपरेटरों के रूप में C # 6 में उपलब्ध है ), जब तक कि C # में पहले से अधिक परिष्कृत आलसी मूल्यांकन नहीं था, या जब तक कि आप प्रतिबिंब का उपयोग नहीं करना चाहते हैं (जो संभवतः भी नहीं है प्रदर्शन और प्रकार-सुरक्षा के कारणों के लिए अच्छा विचार)।
चूँकि cake.frosting.berries.loader
किसी फ़ंक्शन के लिए बस पास होने का कोई तरीका नहीं है (इसका मूल्यांकन किया जाएगा और एक शून्य संदर्भ अपवाद को फेंक दिया जाएगा), आपको निम्नलिखित तरीके से एक सामान्य लुक-अप विधि को लागू करना होगा: यह एक ऑब्जेक्ट और गुणों के नाम में लेता है देखो:
static object LookupProperty( object startingPoint, params string[] lookupChain )
{
// 1. if 'startingPoint' is null, return null, or throw an exception.
// 2. recursively look up one property/field after the other from 'lookupChain',
// using reflection.
// 3. if one lookup is not possible, return null, or throw an exception.
// 3. return the last property/field's value.
}
...
var x = LookupProperty( cake, "frosting", "berries", "loader" );
(नोट: कोड संपादित किया गया।)
आप जल्दी से इस तरह के दृष्टिकोण के साथ कई समस्याएं देखते हैं। सबसे पहले, आपको किसी भी प्रकार की सुरक्षा नहीं मिलती है और एक साधारण प्रकार के संपत्ति मूल्यों की संभावित मुक्केबाजी होती है। दूसरा, आप या null
तो कुछ गलत होने पर वापस लौट सकते हैं, और आपको अपने कॉलिंग फ़ंक्शन में इसके लिए जांचना होगा, या आप एक अपवाद फेंक देंगे, और आप वहीं हैं जहां आपने शुरू किया था। तीसरा, यह धीमा हो सकता है। चौथा, जो आपने शुरू किया था, उससे कहीं ज्यादा यह बदसूरत दिखता है।
[...], या यह सिर्फ एक बुरा विचार है?
मैं या तो साथ रहूँगा:
if (cake != null && cake.frosting != null && ...) ...
या मेहरदाद अफशरी के उपरोक्त उत्तर के साथ जाएं।
पुनश्च: जब मैंने यह उत्तर लिखा था, तो मैंने स्पष्ट रूप से लैम्ब्डा कार्यों के लिए अभिव्यक्ति के पेड़ पर विचार नहीं किया था; इस दिशा में समाधान के लिए उदा @driis का उत्तर देखें। यह एक प्रकार के प्रतिबिंब पर भी आधारित है और इस प्रकार यह बहुत अच्छा प्रदर्शन नहीं कर सकता है और साथ ही एक सरल समाधान ( if (… != null & … != null) …
) भी हो सकता है, लेकिन इसे सिंटैक्स पॉइंट-ऑफ-व्यू से अच्छा माना जा सकता है।