2010-01-08 14 views

उत्तर

8

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 प्रदान करके केवल इस रिश्ते का शोषण)

+1

कोनराड को यह सही मिला लेकिन यदि आप वीबी भाषा के पिछले रखरखाव से इसके बारे में और अधिक पढ़ना चाहते हैं तो आप पॉल विक के लेख http://www.panopticoncentral.net/archive/2003/08/18/179 देख सकते हैं .aspx –

+0

@ChrisHaas दुर्भाग्य से @PaulV ने [पुराने ब्लॉग पोस्ट को छोड़ने का निर्णय लिया है] (http://panopticoncentral.net/2011/03/29/external-requests-versus-internal-requirements/), तो यह अब एक है मृत लिंक –

+0

हू, मुझे यह भी पता नहीं था कि उसने माइक्रोसॉफ्ट छोड़ा था! –

2

संपादित: इस कोड बुराई है; मैंने यह संकेत देने के लिए केवल यह जवाब जोड़ा कि यह संभव है।

एक और मामला उपयोग करने के लिए किया जाएगा या जब भाव है कि पक्ष प्रभाव के कुछ प्रकार प्रदर्शन है कि होने चाहिए का मूल्यांकन:

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 का उपयोग किया तो फर्स्ट टिंगिंग या सेकेंडिंग विफल होने पर, विफलता विधि के पीछे ऑपरेशन नहीं होंगे।

+2

मुझे आशा है कि आपको एहसास होगा कि यह कोड बुरा है। यदि आप साइड इफेक्ट्स चाहते हैं, तो तुलनात्मक रूप से तुलना करें। उपरोक्त कोड काफी अच्छी तरह से obfuscated है: मैं एक के लिए तुरंत सोचता हूं कि यह एक बग है और इरादा नहीं है। –

+1

+1 क्योंकि आपका उत्तर सही है, लेकिन मैं कोनराड से सहमत हूं, ऐसा करने के लिए यह एक अच्छा अभ्यास नहीं है! –

+1

मुझे गलत मत समझो - मैं इसे थोड़ी सी में वकालत नहीं कर रहा हूं! –

3

आपको हमेशा के बजाय OrElse का उपयोग करना चाहिए, सिवाय इसके कि बिट-वार अंकगणित करना।

OrElse एक छोटी-सर्किटिंग तुलना है, जिसका अर्थ यह है कि यदि यह सत्य था तो यह दूसरे खंड का मूल्यांकन नहीं करेगा। यह बेहद उपयोगी है, क्योंकि आप अक्सर क्लॉज चाहते हैं जो शॉर्टरक्यूटिंग के बिना असफल हो सकते हैं (उदाहरण के लिए एक्स कुछ भी नहीं है x.HasSomeProperty नहीं है)।

कारण सभी 'Or's as' OrElse's को स्वचालित रूप से अपग्रेड करना संभव नहीं है क्योंकि दूसरे खंड का मूल्यांकन महत्वपूर्ण हो सकता है। उदाहरण के लिए, मैं "True या SomeBooleanMethodWhichMightThrowAnEception()" लिख सकता हूं। बदलना या एक OrElse में प्रोग्राम का अर्थ बदल जाएगा।

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