2011-01-27 7 views
35

मान लीजिए myObj शून्य है। क्या यह लिखना सुरक्षित है?.NET में सुरक्षित और शॉर्ट सर्किटिंग पर भरोसा कर रहा है?

if(myObj != null && myObj.SomeString != null) 

मैं जानता हूँ कि कुछ भाषाओं दूसरी अभिव्यक्ति पर अमल नहीं करेगा क्योंकि & & गलत का आकलन करने से पहले दूसरे भाग निष्पादित किया जाता है।

उत्तर

56

हां। सी # && और || शॉर्ट सर्किटिंग हैं और इस प्रकार दाएं तरफ केवल तभी मूल्यांकन करते हैं जब बायीं ओर नतीजे पहले ही निर्धारित न हो। ऑपरेटरों & और | दूसरी तरफ शॉर्ट-सर्किट नहीं करते हैं और हमेशा दोनों पक्षों का मूल्यांकन करते हैं।

कल्पना का कहना है:

&& और || ऑपरेटरों सशर्त तार्किक ऑपरेटर कहा जाता है। उन्हें "शॉर्टक्रूटिंग" लॉजिकल ऑपरेटर भी कहा जाता है।
...
आपरेशन x && y आपरेशन x & y से मेल खाती है, कि y छोड़कर मूल्यांकन किया जाता है केवल अगर xtrue
...
आपरेशन x && y(bool)x ? (bool)y : false के रूप में मूल्यांकन किया जाता है। दूसरे शब्दों में, x का पहला मूल्यांकन किया गया है और bool टाइप किया गया है। फिर, यदि xtrue है, y का मूल्यांकन और bool टाइप किया गया है, और यह ऑपरेशन का परिणाम बन जाता है। अन्यथा, ऑपरेशन का परिणाम false है।

(सी # भाषा विशिष्टता संस्करण 4.0 - 7.12 सशर्त तार्किक ऑपरेटरों)

एक && और || की दिलचस्प संपत्ति है कि वे कम सर्किटिंग भले ही वे bools पर काम नहीं करते हैं, लेकिन प्रकार जहां उपयोगकर्ता ने ऑपरेटरों & या | को true और false ऑपरेटर के साथ ओवरलोड किया।

आपरेशन x && yT.false((T)x) ? (T)x : T.&((T)x, y), जहां T.false((T)x)operator falseT में घोषित की एक मंगलाचरण है, और T.&((T)x, वाई) के रूप में मूल्यांकन किया जाता है का चयन किया operator & की एक मंगलाचरण है। इसके अतिरिक्त, मान (टी) एक्स का मूल्यांकन केवल एक बार किया जाएगा।

दूसरे शब्दों में, x पहले का मूल्यांकन किया और टाइप करने के लिए T और operator false अगर x निश्चित रूप से false है परिणाम पर शुरू हो जाती है निर्धारित करने के लिए बदल जाती है।
फिर, x निश्चित रूप से false है, ऑपरेशन का परिणाम x के लिए पहले गणना की गई मान T में परिवर्तित किया गया है।
अन्यथा, y मूल्यांकन किया जाता है, और चयनित ऑपरेटर & पहले x गणना मूल्य पर शुरू हो जाती है टाइप करने के लिए T और y गणना आपरेशन के परिणाम उपज मूल्य बदल दिया।

(सी # भाषा विशिष्टता संस्करण 4.0 - 7.12.2 उपयोगकर्ता-परिभाषित सशर्त तार्किक ऑपरेटरों)

+5

वह अंतिम अनुच्छेद थोड़ा * बहुत * रोचक था ... मेरे सिर को चोट लगी।:) –

+1

यह जटिल लग रहा है, लेकिन यह मुश्किल नहीं है। यदि यह बाईं तरफ 'झूठा' ऑपरेटर 'सत्य' देता है और बाईं तरफ लौटाता है, तो यह सही दाएं का मूल्यांकन नहीं करता है, और अन्यथा कस्टम '&' ऑपरेटर को आमंत्रित करता है। तो यह शॉर्ट सर्किटिंग व्यवहार 'बूल की नकल की नकल करता है। इसका सामान्य अनुप्रयोग एक विस्तारित 'बूल' है जिसमें तीसरा राज्य हो सकता है। उदाहरण के लिए आप 'डीबीबीओएल' या 'बूल' के समान कुछ लागू कर सकते हैं। – CodesInChaos

14

हां, सी # तार्किक लघु-सर्किटिंग का उपयोग करता है।

ध्यान दें कि हालांकि सी # (और कुछ अन्य .NET भाषाएं) इस तरह से व्यवहार करती हैं, यह भाषा की संपत्ति है, सीएलआर नहीं।

+9

असल में, वीबीएनईटी 'एंडअलो' और 'ऑरेलसे' का उपयोग करते समय इस तरह से व्यवहार करता है, * नहीं * 'और 'और' ओआर 'पर, जो संभवतः 9 0% लोग उपयोग करते हैं। –

+1

@ एडम, धन्यवाद, ध्यान दिया। – harpo

+1

यह भी ध्यान रखना महत्वपूर्ण है कि यह न केवल एक कार्यान्वयन विस्तार (जो किसी भी समय बदल सकता है) लेकिन सी # विशिष्टता का हिस्सा है (जो इस संबंध में नहीं बदलेगा)। –

0

यह पूरी तरह से सुरक्षित है। सी # उन भाषाओं में से एक है।

+0

उन भाषाओं में से एक जो शॉर्ट सर्किट मूल्यांकन का उपयोग करता है – Brad

+0

@ एडम, सवाल कहता है, "मुझे कुछ भाषाएं हैं ..." –

+0

@ इल्या कोगन: मुझे लगता है कि इसका मतलब है कि मुझे प्रश्न को और अधिक बारीकी से पढ़ना चाहिए;) –

2

सुनिश्चित करें, यह सी # पर सुरक्षित है, यदि पहला ऑपरेंड झूठा है तो दूसरे का मूल्यांकन कभी नहीं किया जाता है।

+1

यदि आप "खूबसूरत लोगों" में से एक थे, शायद कोई आपके उत्तर को वोट देगा। – Pedro

+0

आपका उत्तर सही है, लेकिन जितना अधिक विस्तार नहीं है क्योंकि CodeInChaos –

0

हां, सी # और अधिकतर भाषाएं बाएं से दाएं वाक्यों की गणना करती हैं।

तरह से पूरी बात की गणना करेंगे, और अगर यह शून्य है एक अपवाद फेंक द्वारा VB6 ...

+0

यह है ... बिल्कुल गलत नहीं है, लेकिन कई स्तरों पर भ्रामक है। (1) घुंघराले ब्रेसिज़ भाषाएं भाषाओं का एक छोटा सबसेट है जो ऐसा करती है। (2) पार्सिंग से पहले इनपुट को उलटना पागलपन है, इसलिए कोई भाषा नहीं करता है। (3) भले ही इसे कैसे पार्स किया गया हो, शॉर्ट-कर्क्यूटिंग रनटाइम अर्थशास्त्र है। (4) वीबी के संबंध में हार्पो के उत्तर को टिप्पणी देखें - 'और' शॉर्ट-कर्क्यूट नहीं है, लेकिन '&' नहीं है। (शायद 2 + 3 हैं क्योंकि आप रनटाइम पर होने वाली किसी चीज़ के साथ पार्सिंग को भ्रमित करते हैं ...) – delnan

+0

हां, ment "computes" पार्स ... संपादित करेंगे। –

4

आपका कोड सुरक्षित है - & & और || दोनों छोटे सर्किट हैं। आप गैर-शॉर्ट सर्किट ऑपरेटर & या | का उपयोग कर सकते हैं, जो दोनों सिरों का मूल्यांकन करता है, लेकिन मुझे वास्तव में बहुत अधिक उत्पादन कोड में नहीं दिखाई देता है।

1

एक उदाहरण

if(strString != null && strString.Length > 0) 

है यह लाइन एक अशक्त अपवाद अगर दोनों पक्षों निष्पादित कारण होगा।

दिलचस्प पक्ष नोट। उपर्युक्त उदाहरण IsNullorEmpty विधि से काफी तेज है।

5

मैं जानता हूँ कि मैं पार्टी के लिए देर हो रही है, लेकिन सी # 6.0 में आप ऐसा भी कर सकते हैं:

if(myObj?.SomeString != null) 

कौन सा रूप में ऊपर एक ही बात है।

यह भी देखें: What does question mark and dot operator ?. mean in C# 6.0?

0

सी # में, && और || शॉर्ट सर्किट कर रहे हैं, जिसका अर्थ है कि पहली शर्त मूल्यांकन किया जाता है और अगर इस सवाल का जवाब निर्धारित किया जाता है बाकी नजरअंदाज कर दिया है।

वीबीएनईटी में, AndAlso और OrElse भी संक्षिप्त सर्किट हैं।

जावास्क्रिप्ट में, && और || भी संक्षिप्त सर्किट हैं।

मैं वीबीएनईटी का उल्लेख करता हूं कि यह दिखाने के लिए कि नेट के बदसूरत लाल-सिर वाले बच्चे-बच्चे में भी अच्छी चीजें हैं, कभी-कभी।

मैं जावास्क्रिप्ट का उल्लेख करता हूं, क्योंकि यदि आप वेब विकास कर रहे हैं तो शायद आप जावास्क्रिप्ट का भी उपयोग कर सकते हैं।

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

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