ใน VB.NET อะไรคือความแตกต่างระหว่างAnd
และAndAlso
? ฉันควรใช้แบบไหน
ใน VB.NET อะไรคือความแตกต่างระหว่างAnd
และAndAlso
? ฉันควรใช้แบบไหน
คำตอบ:
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/
Then
เป็นคำหลักของตัวเอง
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
ซึ่งจะโยนข้อยกเว้น
and
/ or
จนกว่าพวกเขาจะมีเหตุผล - ซึ่งฉันคิดว่าสิ่งที่ถูกต้องตามกฎหมายนั้นมีอยู่น้อยมาก แน่นอนว่ามีเหตุผลอื่น ๆ ที่ภาษาอื่นส่วนใหญ่ลัดวงจรตามค่าเริ่มต้น: มันยังคงมีความรู้สึกของผลในขณะที่ไม่ได้ประเมินการแสดงออกที่อาจมีราคาแพงเมื่อพวกเขาไม่มีส่วนร่วม Stashing ผลข้างเคียงในเงื่อนไขควร, ดี, ตาข้าง แต่นั่นเป็นเพียงความคิดเห็นของฉัน ...
ที่น่าสนใจไม่มีคำตอบที่กล่าวถึงว่า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>
ผล)
If Bool1 And Bool2 Then
ประเมินทั้ง Bool1 และ Bool2
If Bool1 AndAlso Bool2 Then
ประเมิน Bool2 หากว่า Bool1 เป็นจริง
สำหรับทุกคนที่พูดว่าผลข้างเคียงเป็นสิ่งชั่วร้าย: สถานที่ที่มีผลข้างเคียงสองอย่างในสภาพเดียวก็ดีการอ่านวัตถุไฟล์สองไฟล์ควบคู่กัน
While File1.Seek_Next_Row() And File2.Seek_Next_Row()
Str1 = File1.GetRow()
Str2 = File2.GetRow()
End While
การใช้And
เพื่อให้แน่ใจว่าแถวจะถูกใช้ทุกครั้งที่ตรวจสอบเงื่อนไข ในขณะที่AndAlso
อาจอ่านบรรทัดสุดท้ายของFile1
และออกFile2
โดยไม่มีบรรทัดบริโภค
แน่นอนว่าโค้ดข้างต้นใช้งานไม่ได้ แต่ฉันใช้ผลข้างเคียงเช่นนี้ตลอดเวลาและจะไม่คิดว่ามันเป็นรหัส " เลวร้าย " หรือ " ชั่วร้าย " เพราะบางคนอาจทำให้คุณเชื่อ ง่ายต่อการอ่านและมีประสิทธิภาพ
วิธีง่ายๆในการคิดเกี่ยวกับการใช้งานภาษาอังกฤษได้อย่างง่ายยิ่งขึ้น
If Bool1 And Bool2 Then
If [both are true] Then
If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then
นอกจากนี้ยังเป็นเช่นนั้นและยกเว้นว่าจะทำงานเหมือน && ใน C #, C ++ เป็นต้น
ข้อแตกต่างคือถ้าประโยคแรก (อันก่อนก่อนอันอันด์) เป็นจริงประโยคที่สองจะไม่ถูกประเมิน - นิพจน์เชิงตรรกะแบบผสมคือ "การลัดวงจร"
บางครั้งสิ่งนี้มีประโยชน์มากเช่นในนิพจน์เช่น:
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
...
End If
ใช้เก่าและในการแสดงออกข้างต้นจะโยน NullReferenceException ถ้า myObj เป็นโมฆะ
ดูเพิ่มเติมที่คำถาม Stack Overflow: ฉันควรใช้ตัวดำเนินการ AndAlso และ OrElse เสมอหรือไม่ .
นอกจากนี้: ความคิดเห็นสำหรับผู้ที่กล่าวถึงการใช้งานAnd
หากด้านขวาของนิพจน์มีผลข้างเคียงที่คุณต้องการ:
หากด้านขวามีผลข้างเคียงที่คุณต้องการเพียงแค่ย้ายไปทางด้านซ้ายแทนที่จะใช้ "และ" คุณแค่ต้องการ "และ" ถ้าทั้งสองฝ่ายมีผลข้างเคียง และถ้าคุณมีผลข้างเคียงมากมายเกิดขึ้นคุณอาจทำสิ่งอื่นผิดไป โดยทั่วไปแล้วคุณควรจะชอบ And And
นอกเหนือจากคำตอบข้างต้น AndAlso ยังมีกระบวนการปรับสภาพที่เรียกว่าการลัดวงจร ภาษาการเขียนโปรแกรมจำนวนมากมีฟังก์ชั่นนี้ในตัวเหมือนกับ vb.net และสามารถให้ประสิทธิภาพที่เพิ่มขึ้นอย่างมากในข้อความสั่งเงื่อนไขแบบยาวโดยการตัดการประเมินที่ไม่จำเป็นออกไป
อีกเงื่อนไขที่คล้ายกันคือเงื่อนไข OrElse ซึ่งจะตรวจสอบเงื่อนไขที่ถูกต้องหากเงื่อนไขด้านซ้ายเป็นเท็จเท่านั้นดังนั้นการตัดการตรวจสอบเงื่อนไขที่ไม่จำเป็นออกหลังจากพบเงื่อนไขที่แท้จริง
ฉันอยากจะแนะนำให้คุณใช้กระบวนการการลัดวงจรและจัดทำข้อความสั่งแบบมีเงื่อนไขของคุณในรูปแบบที่สามารถได้รับประโยชน์สูงสุดจากสิ่งนี้ ตัวอย่างเช่นทดสอบเงื่อนไขที่มีประสิทธิภาพและเร็วที่สุดของคุณก่อนเพื่อให้คุณรันเงื่อนไขที่ยาวนานของคุณเมื่อคุณจำเป็นต้องทำการลัดวงจรอีกครั้ง
สำหรับเราส่วนใหญ่ OrElse และ AndAlso จะทำเคล็ดลับยกเว้นข้อยกเว้นที่ทำให้เกิดความสับสนเล็กน้อย (น้อยกว่า 1% ซึ่งเราอาจต้องใช้ Or และ And)
พยายามอย่าทำให้คนอื่นแสดงออกโดยใช้ตรรกะบูลีนและทำให้มันดูเหมือนวิทยาศาสตร์จรวด
มันค่อนข้างง่ายและตรงไปตรงมาและบางครั้งระบบของคุณอาจไม่ทำงานอย่างที่คาดไว้เพราะมันไม่ชอบตรรกะของคุณตั้งแต่แรก และสมองของคุณก็บอกคุณเสมอว่าตรรกะของเขานั้นผ่านการทดสอบและพิสูจน์แล้ว 100% และมันก็ใช้ได้ดี ในขณะนั้นหยุดไว้วางใจสมองของคุณและขอให้เขาคิดใหม่อีกครั้งหรือ (ไม่ใช่ OrElse หรือบางทีอาจจะเป็น OrElse) คุณบังคับให้คุณมองหางานอื่นที่ไม่ต้องใช้ตรรกะมากนัก
ใช้กรณี:
ด้วย“ และ” คอมไพเลอร์จะตรวจสอบเงื่อนไขทั้งหมดดังนั้นหากคุณกำลังตรวจสอบว่าวัตถุอาจเป็น“ ไม่มีอะไร” และจากนั้นคุณกำลังตรวจสอบคุณสมบัติอย่างใดอย่างหนึ่งของมันคุณจะมีข้อผิดพลาดเวลาทำงาน
แต่ด้วย AndAlso กับ“ เท็จ” ตัวแรกในเงื่อนไขมันจะตรวจสอบอันถัดไปดังนั้นคุณจะไม่มีข้อผิดพลาด