अगर मैं विजुअल C# 2010 मैं हमेशा साथ निम्नलिखित कोड का टुकड़ा संकलन झूठी मिलती है:परीक्षण हमेशा गलत रिटर्न ... तब भी जब अशक्त
object o = null;
Console.WriteLine("Is null: " + o == null); // returns false
किसी को भी पता है क्यों ???
अगर मैं विजुअल C# 2010 मैं हमेशा साथ निम्नलिखित कोड का टुकड़ा संकलन झूठी मिलती है:परीक्षण हमेशा गलत रिटर्न ... तब भी जब अशक्त
object o = null;
Console.WriteLine("Is null: " + o == null); // returns false
किसी को भी पता है क्यों ???
क्यों आसान है; क्या आप वास्तव में इस होने के रूप में लिखा है के बारे में सोच:
object o = null;
Console.WriteLine(("Is null: " + o) == null); // returns false
यह null
के खिलाफ परीक्षण "Is null: " + o
है, जो हमेशा false
होगा। यह ऑपरेटर प्राथमिकता के नियमों के कारण है, जहां +
==
से पहले आता है।
आप स्पष्ट रूप से यकीन है कि यह आप की तरह काम कर रहा है कोष्ठक आवेदन करना चाहिए हैं:
Console.WriteLine("Is null: " + (o == null)); // returns true
Jim Rhodes द्वारा टिप्पणी में बताया गया है:
यह कई कारणों से आपको हमेशा का उपयोग करना चाहिए में से एक है कोष्ठक और कभी संकलक प्राथमिकता नियमों पर भरोसा नहीं करते हैं।
मैंने खुद को नोट किया कि मैं सहमत हूं; कि मैं भी को ऑपरेटर प्राथमिकता नियमों को याद रखने की कोशिश नहीं करता, बल्कि हर समय माता-पिता के साथ स्पष्ट होने के बजाय। मैं आगे सुझाव देता हूं कि अंतर्निहित प्रकार के रूपांतरण और/या एकाधिक ओवरलोड के साथ विधियों पर निर्भर करते समय भी बहुत सावधान रहना एक कारण है।
मैं यह भी इंगित करना चाहता हूं कि मुझे Ravadretheir answer में नोट किया गया है; क्यों केवल "झूठा" मुद्रित किया गया था, और पूरे पाठ को मुद्रित करने की कोशिश नहीं कर रहे थे।
ऑपरेटर प्राथमिकता।
Console.WriteLine("Is null: " + (o == null));
प्रयास करें अपने कोड में, सबसे पहले o
"Is null: "
स्ट्रिंग है, जो तब की जाँच की है, तो यह मान शून्य करने के लिए जोड़ा गया है। बेशक यह नहीं है, इसलिए इसका मूल्यांकन गलत के रूप में किया जाता है। आपका कॉल के रूप में अगर तुम सिर्फ
Console.WriteLine(false.ToString());
यही कारण है कि केवल "गलत" छपा है, यहां तक कि अपने स्ट्रिंग के बिना लिखते थे एक ही है।
अच्छी वृद्धि यह दर्शाती है कि यह केवल "झूठी" कैसे प्रदर्शित करता है, और न कि "शून्य है: झूठा" –
अन्य उत्तरों ने सही ढंग से समस्या का निदान किया है: ऑपरेटर प्राथमिकता समानता की तुलना में concatenation के लिए उच्च है। जो भी किसी ने संबोधित नहीं किया है, वह आपके कार्यक्रम में अधिक मौलिक त्रुटि है, जो कि आप संक्षेप में कर रहे हैं। एक बेहतर तरीका कोड लिखने के लिए:
Console.WriteLine("is null: {0}", obj == null);
अब संभवतः एक ऑपरेटर पूर्वता समस्या हो नहीं कर सकते क्योंकि सवाल में अभिव्यक्ति केवल एक ही ऑपरेटर है।
सामान्य रूप से आपको स्ट्रिंग कॉन्सटेनेशन से बचने और आउटपुट करने पर स्ट्रिंग प्रतिस्थापन का पक्ष लेना चाहिए। इसे सही करना आसान है, यह अधिक लचीला है, इस तकनीक का उपयोग करके लिखे गए प्रोग्राम को स्थानीय बनाना आसान है, और इसी तरह।
हालांकि, यदि concatenation में अभिव्यक्ति शामिल नहीं है (केवल चर, यहां तक कि स्थिरांक भी हो सकता है) और यह छोटा और सरल है? कई मामलों में concatenation छोटा, स्पष्ट है और यह बेहतर प्रदर्शन करता है। इन तर्कों के बारे में आप क्या सोचते हैं? – Konstantin
यह कई कारणों में से एक है कि आपको हमेशा ब्रांड्स का उपयोग क्यों करना चाहिए और कभी संकलक प्राथमिकता नियमों पर भरोसा नहीं करना चाहिए। –
@ जिमरोड्स वास्तव में; मैं खुद ऑपरेटर प्राथमिकता नियमों को याद रखने की कोशिश भी नहीं करता हूं। यदि यह संभवतः एक मुद्दा हो सकता है, तो मैं स्पष्ट रूप से अपने कोड में प्राथमिकता को इंगित करता हूं। यह उदाहरण * भी * एक मामला दिखा रहा है जहां स्पष्ट प्रकार के रूपांतरण पर भरोसा करना भ्रम पैदा कर सकता है। –