2011-12-07 28 views
41

(OrElse और Or) और (AndAlso और And) के बीच क्या अंतर है? क्या उनके प्रदर्शन में कोई अंतर है, सहीता लाभ कहें ?? क्या ऐसी कोई परिस्थिति है जिसे मैंने ऑरेल और एंडलसो का उपयोग नहीं किया?(OrElse और Or) और (और इसके अलावा और) - कब उपयोग करें?

+2

संभव डुप्लिकेट http://stackoverflow.com/questions/55013/should-i: यहाँ एक साधारण परीक्षण है कि andalso के नाटकीय प्रभाव का पता चलता है -वेवे-उपयोग-द-एंडलसो-एंड-ओरेसे-ऑपरेटर) –

+0

बस वीबीएनईटी (वीबी के लिए कई वर्षों में पहली बार) का उपयोग शुरू किया। मैं केवल इस विशिष्ट प्रश्न पूछने के लिए ऑनलाइन आया था। @aer और उनके बहुत से लोगों को धन्यवाद जिन्होंने उनके महान उत्तरों के साथ स्पष्ट किया। – Hardryv

उत्तर

62

Or/Andहमेशाका मूल्यांकन करेंगे दोनों भाव और फिर एक परिणाम लौटने। वे शॉर्ट सर्किटिंग हैं।

OrElse/AndAlsoshort-circuiting हैं। सही अभिव्यक्ति का मूल्यांकन केवल तभी किया जाता है जब परिणाम अकेले बाएं अभिव्यक्ति के मूल्यांकन से निर्धारित नहीं किया जा सके। (इसका मतलब है कि: OrElse केवल सही अभिव्यक्ति का मूल्यांकन करेंगे अगर छोड़ दिया अभिव्यक्ति गलत है, और AndAlso केवल सही अभिव्यक्ति का मूल्यांकन करेंगे, तो बाईं अभिव्यक्ति सच है।)

यह मानते हुए कि कोई साइड इफेक्ट भाव में होते हैं और अभिव्यक्ति निर्भर नहीं हैं (और किसी निष्पादन ओवरहेड को अनदेखा किया जाता है), फिर वे वही हैं।

हालांकि, कई मामलों में यह है कि अभिव्यक्ति निर्भर हैं। उदाहरण के लिए, हम जब एक सूची नहीं-कुछ भी नहीं है और एक से अधिक तत्व है कुछ करना चाहता हूँ: (! या दुष्प्रभाव, ick)

If list IsNot Nothing AndAlso list.Length > 0 Then .. 'list has stuff 

यह भी एक "महंगा" गणना से बचने के लिए इस्तेमाल किया जा सकता : -, या उससे कम उम्मीद है कि

If Not Validate(x) OrElse Not ExpensiveValidate(x) Then .. 'not valid 

व्यक्तिगत रूप से, मुझे लगता है कि AndAlso और OrElseसही सब में उपयोग करने के लिए ऑपरेटरों लेकिन 1% कर रहे हैं! - उन मामलों में जहां एक दुष्प्रभाव वांछित है।

हैप्पी कोडिंग।


एक अपवाद पहली अभिव्यक्ति मूल्यांकन किया जा रहा से दूसरी अभिव्यक्ति नहीं कर पाएगा में फेंक दिया, लेकिन इस शायद ही आश्चर्य होना चाहिए ..

4

अंतर यह है कि OrElse और andalso शॉर्ट सर्किट आधारित जाएगा पहली शर्त पर, जिसका अर्थ है कि यदि पहली शर्त पास नहीं होती है, तो दूसरी (या अधिक) स्थितियों का मूल्यांकन नहीं किया जाएगा। यह विशेष रूप से उपयोगी होता है जब शर्तों में से एक दूसरे की तुलना में अधिक गहन हो सकता है।

उदाहरण जहां Or ठीक है (दोनों की स्थिति का मूल्यांकन):

If Name = "Fred" Or Name = "Sam" Then 

यह वास्तव में जो रास्ता कोई फर्क नहीं पड़ता के आसपास वे

मूल्यांकन किया जाता है निम्नलिखित AndAlso उपयोगी है, क्योंकि दूसरी शर्त

असफल हो सकता है
If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then 

यह पहली शर्त के लिए यह जांचने की अनुमति देता है कि ऑब्जेक्ट सेट किया गया है या ऑनल y अगर यह सेट किया गया है तो डेटाबेस जाएगा (या कुछ अन्य कार्य)। यदि यह एक सादा And कीवर्ड था, तो दोनों का मूल्यांकन किया जाएगा। जहां OrElse/AndAlso नहीं हैं

10

कम सर्किटिंग अन्य उत्तर में उल्लेख किया है इसके अलावा, Or/And बिटवाइज़ ऑपरेटर्स के रूप में प्रयोग करने योग्य हैं। बिटवाइज ऑपरेशंस में FileAttributes गणना जैसे मानों को जोड़ना शामिल है, जहां आप एक फ़ाइल को इंगित कर सकते हैं और FileAttributes.ReadOnly Or FileAttributes.Hidden

2

@Gideon - खुश किसी ने इंगित किया है।

Dim tm As New Stopwatch 
    Const tries As Integer = 123456 
    Dim z As Integer = 0 
    Dim s() As String = New String() {"0", "one"} 

    Debug.WriteLine("AndAlso") 
    For x As Integer = 0 To s.Length - 1 
     z = 0 
     tm.Restart() 'restart the stopwatch 
     For y As Integer = 0 To tries 
      If s(x) = x.ToString AndAlso s(x) = y.ToString Then '<<<<<<<<<< 
       z += 1 
      End If 
     Next 
     tm.Stop() 
     Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString) 
    Next 

    Debug.WriteLine("And") 
    For x As Integer = 0 To s.Length - 1 
     z = 0 
     tm.Restart() 'restart the stopwatch 
     For y As Integer = 0 To tries 
      If s(x) = x.ToString And s(x) = y.ToString Then '<<<<<<<<<< 
       z += 1 
      End If 
     Next 
     tm.Stop() 
     Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString) 
    Next 
[? मैं हमेशा andalso और OrElse ऑपरेटरों का उपयोग करना चाहिए] (की
संबंधित मुद्दे