क्या कोई ऐसी स्थिति है जहां Or
OrElse
से उपयोग करने के लिए बेहतर है?"OrElse" से अधिक उपयोग करने के लिए "या" बेहतर कब होता है?
यदि नहीं, तो वे आंतरिक कोड को "अपग्रेड" क्यों नहीं करते?
क्या कोई ऐसी स्थिति है जहां Or
OrElse
से उपयोग करने के लिए बेहतर है?"OrElse" से अधिक उपयोग करने के लिए "या" बेहतर कब होता है?
यदि नहीं, तो वे आंतरिक कोड को "अपग्रेड" क्यों नहीं करते?
Or
उपयोग करने के लिए एकमात्र समाधान है जब आप चाहते हैं बिटवाइज़ अंकगणित, यानी आप एक संख्या में बिट्स हेरफेर करना चाहते:
Sub SetBit(value As Integer, Bit As Integer)
value = value Or (1 << Bit)
End Sub
इस तरह केवल मामले Or
लिए उपयुक्त है। अन्य सभी मामलों में (यानी जब बूलियन तर्क का उपयोग करते हैं), OrElse
का उपयोग करें।
उनके समान नामों के बावजूद, Or
और OrElse
अर्थात् काफी विशिष्ट संचालन हैं जिन्हें एक दूसरे के साथ भ्रमित नहीं किया जाना चाहिए। ऐसा इसलिए होता है कि Boolean
एस का आंतरिक प्रतिनिधित्व OrElse
पर समान (लेकिन समान नहीं) प्रभाव प्राप्त करने के लिए बिटवाई Or
का उपयोग करना संभव बनाता है। (। बेसिक और वीबी के पुराने संस्करण - नेट से पहले - एक Or
आपरेशन, कोई OrElse
प्रदान करके केवल इस रिश्ते का शोषण)
संपादित: इस कोड बुराई है; मैंने यह संकेत देने के लिए केवल यह जवाब जोड़ा कि यह संभव है।
एक और मामला उपयोग करने के लिए किया जाएगा या जब भाव है कि पक्ष प्रभाव के कुछ प्रकार प्रदर्शन है कि होने चाहिए का मूल्यांकन:
Sub DoSomething()
Dim succeeded As Boolean
succeeded = FirstThing() Or SecondThing() Or ThirdThing()
If succeeded Then
' Do something here
End If
End Sub
इस मामले FirstThing, SecondThing, और ThirdThing तरीकों कि एक पूरे के रूप निष्पादित किया जाना चाहिए में चाहे उनमें से कोई भी सफल मूल्य जमा करते समय विफल हो या नहीं। यदि आपने OrElse का उपयोग किया तो फर्स्ट टिंगिंग या सेकेंडिंग विफल होने पर, विफलता विधि के पीछे ऑपरेशन नहीं होंगे।
मुझे आशा है कि आपको एहसास होगा कि यह कोड बुरा है। यदि आप साइड इफेक्ट्स चाहते हैं, तो तुलनात्मक रूप से तुलना करें। उपरोक्त कोड काफी अच्छी तरह से obfuscated है: मैं एक के लिए तुरंत सोचता हूं कि यह एक बग है और इरादा नहीं है। –
+1 क्योंकि आपका उत्तर सही है, लेकिन मैं कोनराड से सहमत हूं, ऐसा करने के लिए यह एक अच्छा अभ्यास नहीं है! –
मुझे गलत मत समझो - मैं इसे थोड़ी सी में वकालत नहीं कर रहा हूं! –
आपको हमेशा के बजाय OrElse का उपयोग करना चाहिए, सिवाय इसके कि बिट-वार अंकगणित करना।
OrElse एक छोटी-सर्किटिंग तुलना है, जिसका अर्थ यह है कि यदि यह सत्य था तो यह दूसरे खंड का मूल्यांकन नहीं करेगा। यह बेहद उपयोगी है, क्योंकि आप अक्सर क्लॉज चाहते हैं जो शॉर्टरक्यूटिंग के बिना असफल हो सकते हैं (उदाहरण के लिए एक्स कुछ भी नहीं है x.HasSomeProperty नहीं है)।
कारण सभी 'Or's as' OrElse's को स्वचालित रूप से अपग्रेड करना संभव नहीं है क्योंकि दूसरे खंड का मूल्यांकन महत्वपूर्ण हो सकता है। उदाहरण के लिए, मैं "True या SomeBooleanMethodWhichMightThrowAnEception()" लिख सकता हूं। बदलना या एक OrElse में प्रोग्राम का अर्थ बदल जाएगा।
कोनराड को यह सही मिला लेकिन यदि आप वीबी भाषा के पिछले रखरखाव से इसके बारे में और अधिक पढ़ना चाहते हैं तो आप पॉल विक के लेख http://www.panopticoncentral.net/archive/2003/08/18/179 देख सकते हैं .aspx –
@ChrisHaas दुर्भाग्य से @PaulV ने [पुराने ब्लॉग पोस्ट को छोड़ने का निर्णय लिया है] (http://panopticoncentral.net/2011/03/29/external-requests-versus-internal-requirements/), तो यह अब एक है मृत लिंक –
हू, मुझे यह भी पता नहीं था कि उसने माइक्रोसॉफ्ट छोड़ा था! –