อะไรคือความแตกต่างระหว่าง And และ AndAlso ใน VB.NET?


คำตอบ:


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-orelse/


2
ลิงก์ "ข้อมูลเพิ่มเติม" ใช้งานไม่ได้ นี่คือ URL ใหม่: panopticoncentral.net/2003/08/18/…
Rory O'Kane

12
มีใครรู้บ้างไหมว่าทำไมพวกเขาถึงไม่เลือก "แล้ว" แทน? ฉันคิดว่ามันจะใช้งานง่ายขึ้น
tmighty

7
ฉันมักจะคิดว่านี่เป็นเคาน์เตอร์ที่ใช้งานง่าย และยังบอกเป็นนัยว่ามันจะตรวจสอบทั้งคู่และนี่ควรเป็นวิธีอื่น ๆ ! ดังนั้นทำไมฉันต้องมาที่ SO เพื่อตรวจสอบสิ่งต่าง ๆ เช่นนี้ (ใช่ฉันเป็นคน # ac) คุณไม่ควรถามคำถามเช่น "ความแตกต่างระหว่าง And และ AndAlso" มากเกินไป! ครูสอนภาษาอังกฤษของฉันคงจะฆ่าฉัน
Robin French

3
เมื่อใดก็ตามที่ฉันใช้ OrElse ฉันคิดถึง South Park เสมอ "หรืออย่างอื่นอะไร "แน่นอน"
Robin French

1
@tightight เดาว่ามันจะทำให้เกิดความสับสนมากขึ้นเพราะThenเป็นคำหลักของตัวเอง
binki

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
หากด้านขวามีผลข้างเคียงที่คุณต้องการเพียงแค่ย้ายไปทางด้านซ้ายแทนที่จะใช้ "และ" คุณต้องการเพียงแค่ "และ" ถ้าทั้งสองฝ่ายมีผลข้างเคียง และถ้าคุณมีผลข้างเคียงมากมายเกิดขึ้นคุณอาจทำสิ่งอื่นผิดไป
Joel Coehoorn

1
อันดับแรก Andalso ไม่ได้ถูกใช้เพื่อ 'บันทึกบนรันไทม์' ซึ่งเป็นสิ่งที่ผิดปกติ ประการที่สองการมีอาร์กิวเมนต์ที่สองทำ 'ผลข้างเคียง' ที่เป็นประโยชน์คือการปฏิบัติที่ไม่ดีที่น่าเกลียด
Tor Haugen

2
คุณไม่สามารถยืนยันได้ว่ามันจะไม่ 'บันทึกในรันไทม์' และฉันได้พบสถานการณ์ที่ผลข้างเคียงเป็นจริงไม่ใช่การปฏิบัติที่ไม่ดีน่าเกลียด
Ed Marty

1
"โดยทั่วไปคนใช้วิธีลัดวงจรถ้ามีเหตุผลที่จะไม่ตรวจสอบส่วนที่สองอย่างชัดเจน" Erm, wut? ฉันหวังว่าผู้คนใช้การลัดวงจรเว้นแต่พวกเขาจะมีเหตุผลที่จะไม่ทำ! ไม่มีใครควรใช้ของเก่าand/ orจนกว่าพวกเขาจะมีเหตุผล - ซึ่งฉันคิดว่าสิ่งที่ถูกต้องตามกฎหมายนั้นมีอยู่น้อยมาก แน่นอนว่ามีเหตุผลอื่น ๆ ที่ภาษาอื่นส่วนใหญ่ลัดวงจรตามค่าเริ่มต้น: มันยังคงมีความรู้สึกของผลในขณะที่ไม่ได้ประเมินการแสดงออกที่อาจมีราคาแพงเมื่อพวกเขาไม่มีส่วนร่วม Stashing ผลข้างเคียงในเงื่อนไขควร, ดี, ตาข้าง แต่นั่นเป็นเพียงความคิดเห็นของฉัน ...
underscore_d

20

ที่น่าสนใจไม่มีคำตอบที่กล่าวถึงว่าAndและOrใน VB.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ให้-1แสดงNotยังเป็นผู้ประกอบการบิต

||และ&&(เวอร์ชัน C # OrElseและAndAlso) คืนค่านิพจน์ที่ประเมินล่าสุดซึ่งจะเป็น3และ5ตามลำดับ สิ่งนี้ช่วยให้คุณใช้สำนวนv || 5ใน C # เพื่อให้5เป็นค่าของการแสดงออกเมื่อvเป็นnullหรือ ( 0และจำนวนเต็ม) และมูลค่าvมิฉะนั้น ความแตกต่างในความหมายสามารถจับโปรแกรมเมอร์ C # ใน VB.NET off guard เป็น "สำนวนค่าเริ่มต้น" นี้ไม่ทำงานใน 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 ยกที่คุณได้รับNullable<bool>ผล)
Ben Voigt


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
ภาษาอังกฤษมีความสับสนมากกว่ารหัสเพราะมันไม่มีสเปค!
binki

5

นอกจากนี้ยังเป็นเช่นนั้นและยกเว้นว่าจะทำงานเหมือน && ใน C #, C ++ เป็นต้น

ข้อแตกต่างคือถ้าประโยคแรก (อันก่อนก่อนอันอันด์) เป็นจริงประโยคที่สองจะไม่ถูกประเมิน - นิพจน์เชิงตรรกะแบบผสมคือ "การลัดวงจร"

บางครั้งสิ่งนี้มีประโยชน์มากเช่นในนิพจน์เช่น:

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

ใช้เก่าและในการแสดงออกข้างต้นจะโยน NullReferenceException ถ้า myObj เป็นโมฆะ


5

ดูเพิ่มเติมที่คำถาม Stack Overflow: ฉันควรใช้ตัวดำเนินการ AndAlso และ OrElse เสมอหรือไม่ .

นอกจากนี้: ความคิดเห็นสำหรับผู้ที่กล่าวถึงการใช้งานAndหากด้านขวาของนิพจน์มีผลข้างเคียงที่คุณต้องการ:

หากด้านขวามีผลข้างเคียงที่คุณต้องการเพียงแค่ย้ายไปทางด้านซ้ายแทนที่จะใช้ "และ" คุณแค่ต้องการ "และ" ถ้าทั้งสองฝ่ายมีผลข้างเคียง และถ้าคุณมีผลข้างเคียงมากมายเกิดขึ้นคุณอาจทำสิ่งอื่นผิดไป โดยทั่วไปแล้วคุณควรจะชอบ And And


3

นอกเหนือจากคำตอบข้างต้น AndAlso ยังมีกระบวนการปรับสภาพที่เรียกว่าการลัดวงจร ภาษาการเขียนโปรแกรมจำนวนมากมีฟังก์ชั่นนี้ในตัวเหมือนกับ vb.net และสามารถให้ประสิทธิภาพที่เพิ่มขึ้นอย่างมากในข้อความสั่งเงื่อนไขแบบยาวโดยการตัดการประเมินที่ไม่จำเป็นออกไป

อีกเงื่อนไขที่คล้ายกันคือเงื่อนไข OrElse ซึ่งจะตรวจสอบเงื่อนไขที่ถูกต้องหากเงื่อนไขด้านซ้ายเป็นเท็จเท่านั้นดังนั้นการตัดการตรวจสอบเงื่อนไขที่ไม่จำเป็นออกหลังจากพบเงื่อนไขที่แท้จริง

ฉันอยากจะแนะนำให้คุณใช้กระบวนการการลัดวงจรและจัดทำข้อความสั่งแบบมีเงื่อนไขของคุณในรูปแบบที่สามารถได้รับประโยชน์สูงสุดจากสิ่งนี้ ตัวอย่างเช่นทดสอบเงื่อนไขที่มีประสิทธิภาพและเร็วที่สุดของคุณก่อนเพื่อให้คุณรันเงื่อนไขที่ยาวนานของคุณเมื่อคุณจำเป็นต้องทำการลัดวงจรอีกครั้ง


นอกจากนี้มูลค่าการกล่าวขวัญก็คือ IIF (ทันทีถ้า) เพราะมันไม่ได้ลัดวงจรและสามารถสร้างเงื่อนไขค่อนข้างแตกต่างจากเจตนาของโปรแกรมเมอร์เนื่องจากทั้งองค์ประกอบจริงและเท็จได้รับการประเมิน ก่อนหน้านี้มีคนกล่าวว่าพวกเขาใช้พฤติกรรมผลข้างเคียงนี้โดยเจตนา แต่ - ฉันไม่คิดว่าเป็นวิธีที่มีประสิทธิภาพเนื่องจากในทันทีถ้าไม่มีเจตนาที่มุ่งมั่นในการประเมินผลในลักษณะที่ฉันสามารถตรวจจับได้
jinzai

"นอกจากคำตอบข้างต้นแล้ว AndAlso ยังมีกระบวนการปรับสภาพที่เรียกว่าการลัดวงจร" ทุกคำตอบเหนือสิ่งนี้จะทำให้เกิดการลัดวงจร : P แต่คำอธิบายที่ดีและคำแนะนำ
underscore_d

1

สำหรับเราส่วนใหญ่ OrElse และ AndAlso จะทำเคล็ดลับยกเว้นข้อยกเว้นที่ทำให้เกิดความสับสนเล็กน้อย (น้อยกว่า 1% ซึ่งเราอาจต้องใช้ Or และ And)

พยายามอย่าทำให้คนอื่นแสดงออกโดยใช้ตรรกะบูลีนและทำให้มันดูเหมือนวิทยาศาสตร์จรวด

มันค่อนข้างง่ายและตรงไปตรงมาและบางครั้งระบบของคุณอาจไม่ทำงานอย่างที่คาดไว้เพราะมันไม่ชอบตรรกะของคุณตั้งแต่แรก และสมองของคุณก็บอกคุณเสมอว่าตรรกะของเขานั้นผ่านการทดสอบและพิสูจน์แล้ว 100% และมันก็ใช้ได้ดี ในขณะนั้นหยุดไว้วางใจสมองของคุณและขอให้เขาคิดใหม่อีกครั้งหรือ (ไม่ใช่ OrElse หรือบางทีอาจจะเป็น OrElse) คุณบังคับให้คุณมองหางานอื่นที่ไม่ต้องใช้ตรรกะมากนัก


0

หากต้องการทำความเข้าใจกับคำที่ไม่ใช่ตัวแปลงสัญญาณ:

ใช้กรณี:
ด้วย“ และ” คอมไพเลอร์จะตรวจสอบเงื่อนไขทั้งหมดดังนั้นหากคุณกำลังตรวจสอบว่าวัตถุอาจเป็น“ ไม่มีอะไร” และจากนั้นคุณกำลังตรวจสอบคุณสมบัติอย่างใดอย่างหนึ่งของมันคุณจะมีข้อผิดพลาดเวลาทำงาน
แต่ด้วย AndAlso กับ“ เท็จ” ตัวแรกในเงื่อนไขมันจะตรวจสอบอันถัดไปดังนั้นคุณจะไม่มีข้อผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.