VB.NET में AndAlso और अंतर क्या है?


जवाबों:


380

Andऑपरेटर दोनों पक्षों, मूल्यांकन करता है जहां AndAlsoमूल्यांकन करता दाईं ओर यदि और केवल यदि बाईं ओर सच है।

एक उदाहरण:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If

ऊपर एक अपवाद फेंकता है अगर mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If

यह एक अपवाद नहीं है।

इसलिए यदि आप C # दुनिया से आते हैं, तो आपको इसका उपयोग करना चाहिए AndAlsoजैसे आप उपयोग करेंगे &&

यहां अधिक जानकारी: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orel//


2
"अधिक जानकारी" लिंक टूट गया है। यहाँ नया URL है: panopticoncentral.net/2003/08/18/…
रोरी ओ'केन

12
क्या कोई जानता है कि उन्होंने इसके बजाय "AndThen" को क्यों नहीं चुना है? मुझे लगता है कि यह अधिक सहज होगा।
tmighty

7
मैंने हमेशा सोचा है कि यह काउंटर सहज था। AndAsoso यह दोनों की जाँच करने के लिए जा रहा है और यह दूसरा तरीका होना चाहिए! इसलिए मुझे एसओ के पास इस तरह की चीजों की जांच करने के लिए आना है (हाँ मैं एसी # आदमी हूं)। आपको कभी भी "और एंडलासो के बीच अंतर" जैसे सवाल नहीं पूछना चाहिए। बहुत सारे और! मेरे अंग्रेजी शिक्षक ने मुझे मार दिया होगा
रॉबिन फ्रेंच

3
जब भी मैं हमेशा दक्षिण पार्क के बारे में सोचता हूं तो Orll का उपयोग करता हूं "या फिर क्या?" "बिल्कुल"
रॉबिन फ्रेंच

1
@tmighty ने अनुमान लगाया कि यह अधिक भ्रम का कारण बनेगा क्योंकि Thenयह स्वयं का कीवर्ड है।
बिंकी

29

Andऑपरेटर, आगे बढ़ने से पहले बयान में सभी शर्तों की जाँच जबकि andalso ऑपरेटर अगर यह जानता हालत झूठी है बंद हो जाएगा होगा। उदाहरण के लिए:

if x = 5 And y = 7

जाँच करता है कि क्या x 5 के बराबर है, और यदि y 7 के बराबर है, तो जारी है यदि दोनों सत्य हैं।

if x = 5 AndAlso y = 7

अगर x 5 के बराबर है तो चेक करता है। यदि यह नहीं है, तो यह जांच नहीं करता है कि क्या y 7 है, क्योंकि यह जानता है कि स्थिति पहले से ही झूठी है। (इसे शॉर्ट-सर्क्युटिंग कहा जाता है।)

आम तौर पर लोग शॉर्ट-सर्कुलेटिंग विधि का उपयोग करते हैं यदि कोई कारण स्पष्ट रूप से दूसरे भाग की जांच नहीं करना है यदि पहला भाग सत्य नहीं है, जैसे कि अगर यह जाँच की जाए तो अपवाद को फेंक देगा। उदाहरण के लिए:

If Not Object Is Nothing AndAlso Object.Load()

यदि Andइसके बजाय इसका उपयोग किया जाता है AndAlso, तो यह तब भी प्रयास Object.Load()करेगा यदि यह थे nothing, जो एक अपवाद को फेंक देगा।


14
यदि दाईं ओर एक साइड इफेक्ट की आवश्यकता है, तो बस "और" का उपयोग करने के बजाय इसे बाईं ओर ले जाएं। आपको केवल "एंड" की आवश्यकता है यदि दोनों पक्षों पर दुष्प्रभाव हैं। और अगर आपके पास है कि कई साइड इफेक्ट्स चल रहे हैं तो आप शायद कुछ और गलत कर रहे हैं।
जोएल कोएहॉर्न

1
सबसे पहले, आंदालो को मुख्य रूप से 'रनटाइम को बचाने' के लिए उपयोग नहीं किया जाता है, जो कि पहले से तैयार है। दूसरा, दूसरा तर्क देने से कुछ उपयोगी 'साइड इफ़ेक्ट' होता है, वह है- बदसूरत-गधा बुरा व्यवहार।
Tor Haugen

2
आप यह तर्क नहीं दे सकते कि यह 'रनटाइम पर सेव' नहीं है। और मुझे ऐसी परिस्थितियां मिली हैं जहां दुष्प्रभाव वास्तव में हैं, न कि बदसूरत-गधा बुरा अभ्यास।
एड मार्टी

1
"आम तौर पर लोग शॉर्ट-सर्कुलेटिंग विधि का उपयोग करते हैं अगर कोई कारण स्पष्ट रूप से दूसरे भाग की जांच नहीं करना है" एर्म, वूट? मुझे उम्मीद है कि लोग शॉर्ट-सर्कुलेटिंग का उपयोग करेंगे जब तक कि उनके पास कोई कारण न हो! किसी को भी पुराने का उपयोग नहीं करना चाहिए and/ orजब तक कि उनके पास कोई कारण न हो - जिनमें से मुझे लगता है कि वैध लोग कम और बहुत दूर हैं। निश्चित रूप से डिफ़ॉल्ट रूप से अधिकांश अन्य भाषाओं में शॉर्ट-सर्किट का कारण होता है: यह परिणाम की भावना को बनाए रखता है, जबकि संभावित रूप से महंगी अभिव्यक्तियों का मूल्यांकन नहीं करते हैं जब वे कुछ भी योगदान नहीं करते हैं। स्थितियों में साइड-इफेक्ट्स का प्रभाव होना चाहिए, ठीक है, साइड-आईड। लेकिन यह सिर्फ मेरी राय है ...
underscore_d

20

दिलचस्प बात यह है जवाब में से कोई भी उल्लेख किया है कि Andऔर OrVB.NET में जबकि सा ऑपरेटर हैं OrElseऔर AndAlsoसख्ती से बूलियन ऑपरेटरों हैं।

Dim a = 3 OR 5 ' Will set a to the value 7, 011 or 101 = 111
Dim a = 3 And 5 ' Will set a to the value 1, 011 and 101 = 001
Dim b = 3 OrElse 5 ' Will set b to the value true and not evaluate the 5
Dim b = 3 AndAlso 5 ' Will set b to the value true after evaluating the 5
Dim c = 0 AndAlso 5 ' Will set c to the value false and not evaluate the 5

नोट : एक गैर शून्य पूर्णांक माना जाता है true; प्रदर्शन Dim e = not 0करने के eलिए सेट भी एक बिट ऑपरेटर है।-1Not

||और &&(सी # के संस्करणों OrElseऔर AndAlso) पिछले का मूल्यांकन अभिव्यक्ति जो होगा लौटने 3और 5क्रमशः। यह आपको मुहावरा उपयोग करने देता है v || 5सी # में देने के लिए 5जब अभिव्यक्ति के मूल्य के रूप में vहै nullया ( 0और एक पूर्णांक) और का मान vअन्यथा। शब्दार्थ का अंतर VB.NET के गार्ड में C # प्रोग्रामर डब्बलिंग को पकड़ सकता है क्योंकि यह "डिफ़ॉल्ट मान मुहावरा" VB.NET में काम नहीं करता है।

तो, प्रश्न का उत्तर देने के लिए : बिट ऑपरेशंस (पूर्णांक या बूलियन) का उपयोग करें Orऔर करें And। का प्रयोग करें OrElseऔर AndAlso"शॉर्ट सर्किट" एक ऑपरेशन के लिए समय बचाने के लिए, या यह मूल्यांकन करने के लिए पहले एक मूल्यांकन की वैधता का परीक्षण करने के लिए। If valid(evaluation) andalso evaluation thenयाif not (unsafe(evaluation) orelse (not evaluation)) then

बोनस: निम्नलिखित का मूल्य क्या है?

Dim e = Not 0 And 3

मुझे लगता है कि आप उलझन में हैं ||और &&साथ हैं ??। जबकि ऐसी भाषाएं हैं जहां ||गैर-गलत मूल्य वापस आ जाएंगे, C # उनमें से एक नहीं है, और एक रिटर्न देता है bool(हटाए गए अशक्त ऑपरेटरों को छोड़कर, जहां आपको एक Nullable<bool>परिणाम मिलता है )
बेन Voigt

14
If Bool1 And Bool2 Then

बूल 1 और बूल 2 दोनों का मूल्यांकन करता है

If Bool1 AndAlso Bool2 Then

बूल 2 का मूल्यांकन करता है यदि और केवल बूल 1 सच है।


13

बस उन सभी लोगों के लिए जो साइड इफेक्ट कहते हैं, वे बुराई हैं: एक ऐसी जगह जहां एक ही स्थिति में दो साइड इफेक्ट्स होना अच्छा होता है, दो फाइल ऑब्जेक्ट्स को अग्रानुक्रम में पढ़ना होगा।

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While

का उपयोग Andसुनिश्चित एक पंक्ति हर बार हालत की जाँच कर रहा है सेवन किया जाता है कि। जबकि AndAlsoअंतिम पंक्ति को पढ़ सकते हैं File1और File2बिना उपभोग की रेखा के छोड़ सकते हैं।

बेशक कोड ऊपर काम नहीं करेगा, लेकिन मैं हर समय इस तरह के साइड इफेक्ट्स का उपयोग करता हूं और इसे " बुरा " या " बुराई " कोड नहीं मानूंगा क्योंकि कुछ आपको विश्वास करने के लिए प्रेरित करेंगे। यह पढ़ने में आसान और कुशल है।


5

इसके बारे में सोचने का एक सरल तरीका समतल अंग्रेजी का उपयोग करना है

If Bool1 And Bool2 Then
If [both are true] Then


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then

3
अंग्रेजी कोड की तुलना में अधिक भ्रामक है क्योंकि इसमें कोई युक्ति नहीं है!
बिंकी

5

AndAlso बहुत पसंद है और, सिवाय इसके कि यह & # C, C ++, आदि में && काम करता है।

अंतर यह है कि यदि पहला क्लॉज (एंडलास से पहले वाला) सच है, तो दूसरे क्लॉज का मूल्यांकन कभी नहीं किया जाता है - यौगिक तार्किक अभिव्यक्ति "शॉर्ट सर्कुलेटेड" है।

यह कभी-कभी बहुत उपयोगी होता है, जैसे कि अभिव्यक्ति में:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If

पुराने का उपयोग करना और उपरोक्त अभिव्यक्ति में एक NullReferenceException फेंक देगा यदि myObj शून्य थे।


5

स्टैक ओवरफ्लो प्रश्न भी देखें: क्या मुझे हमेशा एंडो और ऑर्लस ऑपरेटरों का उपयोग करना चाहिए?

इसके अलावा: उन लोगों के लिए एक टिप्पणी जिनका उपयोग करके उल्लेख किया Andगया है कि अभिव्यक्ति के दाईं ओर एक साइड-इफेक्ट है जिसकी आपको आवश्यकता है:

यदि दाईं ओर के साइड इफेक्ट की आपको आवश्यकता है, तो बस "और" का उपयोग करने के बजाय इसे बाईं ओर ले जाएं। आपको केवल "एंड" की आवश्यकता है यदि दोनों पक्षों पर दुष्प्रभाव हैं। और अगर आपके पास है कि कई साइड इफेक्ट्स चल रहे हैं तो आप शायद कुछ और गलत कर रहे हैं। सामान्य तौर पर, आपको वास्तव में एंडलासो को पसंद करना चाहिए।


3

ऊपर दिए गए उत्तरों के अलावा, AndAlso एक शॉर्ट सर्किटिंग के रूप में जानी जाने वाली एक कंडीशनिंग प्रक्रिया प्रदान करता है। कई प्रोग्रामिंग भाषाओं में यह कार्यक्षमता है जैसे vb.net करता है, और मूल्यांकन को अनावश्यक रूप से काटकर लंबी स्थिति के बयानों में पर्याप्त प्रदर्शन बढ़ा सकता है।

इसी तरह की एक और स्थिति ऑर्लेज़ स्थिति है जो केवल सही स्थिति की जांच करेगी यदि बाईं स्थिति झूठी है, इस प्रकार एक वास्तविक स्थिति पाए जाने के बाद अनावश्यक स्थिति की जाँच करना।

मैं आपको सलाह दूंगा कि आप हमेशा शॉर्ट सर्कुलेटिंग प्रक्रियाओं का उपयोग करें और अपने सशर्त बयानों को इस तरह से तैयार करें कि इससे सबसे ज्यादा फायदा हो सके। उदाहरण के लिए, अपनी सबसे कुशल और सबसे तेज़ स्थितियों का परीक्षण पहले करें ताकि आप केवल अपनी लंबी स्थितियों को चलाएं जब आपको दूसरी बार पूरी तरह से और शॉर्ट सर्किट करना पड़े।


इसके अलावा उल्लेख के लायक है IIF (तत्काल अगर) क्योंकि यह शॉर्ट-सर्किट नहीं करता है और प्रोग्रामर के इरादे के विपरीत स्थितियां पैदा कर सकता है, क्योंकि दोनों सही और गलत घटकों का मूल्यांकन किया जाता है। इससे पहले, किसी ने कहा कि वे इस पक्ष-प्रभाव व्यवहार का जानबूझकर उपयोग करते हैं, लेकिन - मैं इसे एक प्रभावी विधि के रूप में नहीं देखता हूं, चूंकि तत्काल अगर उस तरीके से मूल्यांकन करने का कोई उद्देश्यपूर्ण इरादा नहीं है जो मैं पता लगा सकता हूं।
जिंज़ई

"ऊपर दिए गए उत्तरों के अलावा, AndAlso एक शॉर्ट सर्किटिंग नामक एक कंडीशनिंग प्रक्रिया प्रदान करता है।" इसके ऊपर का हर उत्तर लघु-परिच्छेद पर केंद्रित है। : पी लेकिन अच्छा विवरण और सिफारिशें।
अंडरस्कोर_ड

1

हम में से अधिकांश के लिए OrElse और AndAlso कुछ भ्रमित करने वाले अपवादों को छोड़कर चाल करेंगे (1% से कम जहां हमें Or और And का उपयोग करना पड़ सकता है)।

कोशिश करें कि लोग अपने बूलियन लॉजिक्स को बंद न करें और इसे रॉकेट साइंस की तरह बनाएं।

यह काफी सरल और सीधे आगे है और कभी-कभी आपका सिस्टम उम्मीद के मुताबिक काम नहीं कर सकता है क्योंकि यह आपके तर्क को पहली जगह में पसंद नहीं करता है। और फिर भी आपका मस्तिष्क आपको बताता है कि उसका तर्क 100% परीक्षण और सिद्ध है और इसे काम करना चाहिए। उसी क्षण अपने मस्तिष्क पर भरोसा करना बंद कर दें और उसे फिर से सोचने के लिए कहें या नहीं (ओरलसे या शायद ऑर्लेसे) आप अपने आप को एक और नौकरी की तलाश करने के लिए मजबूर करते हैं जिसमें बहुत तर्क की आवश्यकता नहीं होती है।


0

कोड नहीं शब्दों के साथ समझने के लिए:

केस का उपयोग करें:
"एंड" के साथ कंपाइलर सभी शर्तों की जांच करेगा, यदि आप जाँच रहे हैं कि कोई ऑब्जेक्ट "कुछ भी नहीं" हो सकता है और फिर आप इसमें से किसी एक गुण की जाँच कर रहे हैं तो आपके पास रन टाइम एरर होगा।
लेकिन पहले "झूठे" शर्तों के साथ एंडलासो के साथ यह अगले एक की जांच करेगा ताकि आपको कोई त्रुटि न हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.