IsNothing กับ Is Nothing


130

มีใครบ้างที่ใช้ VB.NET และมีความชอบหรือต่อต้านการใช้IsNothingซึ่งตรงข้ามกับIs Nothing(ตัวอย่างเช่นIf IsNothing(anObject)หรือIf anObject Is Nothing... )? ถ้าเป็นเช่นนั้นทำไม?

แก้ไข: หากคุณคิดว่าทั้งคู่ยอมรับได้อย่างเท่าเทียมกันคุณคิดว่าดีที่สุดที่จะเลือกหนึ่งอันและติดกับมันหรือจะผสมเข้าด้วยกัน?


3
มีเหตุผลดีๆมากมายที่ควรหลีกเลี่ยงIsNothing()
KyleMit

@JesseChisholm มีมากเกินไปสำหรับความคิดเห็นเดียว แต่ความคิดเห็นก่อนหน้าของฉันโพสต์ลิงก์นี้ไปยังบทความซึ่งแจกแจง 5 บทความที่แตกต่างกันblog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit

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

คำตอบ:


125

หากคุณดูที่ MSIL ในขณะที่กำลังดำเนินการอยู่คุณจะเห็นว่ามันไม่ได้รวบรวมรหัสเดียวกันทั้งหมด เมื่อคุณใช้ IsNothing () มันจะเรียกใช้เมธอดนั้นจริง ๆ ซึ่งต่างจากการประเมินนิพจน์เท่านั้น

เหตุผลที่ฉันมักจะเอนเอียงไปใช้ "Is Nothing" คือเมื่อฉันปฏิเสธมันจะกลายเป็น "IsNot Nothing" แทนที่จะเป็น "Not IsNothing (object)" ซึ่งโดยส่วนตัวแล้วฉันรู้สึกว่าดูน่าอ่านกว่า


46

ฉันพบว่าPatrick Steeleตอบคำถามนี้ได้ดีที่สุดในบล็อกของเขา: Avoiding IsNothing ()

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

แก้ไข - ความคิดเห็นของ VoteCoffe ที่นี่

เนื้อหาบทความบางส่วน: หลังจากตรวจสอบโค้ดเพิ่มเติมแล้วฉันพบเหตุผลอื่นที่คุณควรหลีกเลี่ยงสิ่งนี้: ยอมรับประเภทค่า! เห็นได้ชัดว่าเนื่องจาก IsNothing () เป็นฟังก์ชันที่ยอมรับ 'วัตถุ' คุณจึงสามารถส่งผ่านอะไรก็ได้ที่คุณต้องการ หากเป็นประเภทค่า. NET จะใส่กล่องลงในวัตถุและส่งต่อไปยัง IsNothing ซึ่งจะส่งคืนค่าเท็จในค่าที่บรรจุกล่องเสมอ! คอมไพลเลอร์ VB.NET จะตรวจสอบไวยากรณ์สไตล์ "Is Nothing" และจะไม่คอมไพล์หากคุณพยายามทำ "Is Nothing" ในประเภทค่า แต่ฟังก์ชัน IsNothing () รวบรวมโดยไม่มีข้อร้องเรียน -PSteele - VoteCoffee


7
เนื้อหาบทความบางส่วน: หลังจากตรวจสอบโค้ดเพิ่มเติมแล้วฉันพบเหตุผลอื่นที่คุณควรหลีกเลี่ยงสิ่งนี้: ยอมรับประเภทค่า! เห็นได้ชัดว่าเนื่องจาก IsNothing () เป็นฟังก์ชันที่ยอมรับ 'วัตถุ' คุณจึงสามารถส่งผ่านอะไรก็ได้ที่คุณต้องการ หากเป็นประเภทค่า. NET จะใส่กล่องลงในวัตถุและส่งต่อไปยัง IsNothing ซึ่งจะส่งคืนค่าเท็จในค่าที่บรรจุกล่องเสมอ! คอมไพลเลอร์ VB.NET จะตรวจสอบไวยากรณ์สไตล์ "Is Nothing" และจะไม่คอมไพล์หากคุณพยายามทำ "Is Nothing" ในประเภทค่า แต่ฟังก์ชัน IsNothing () รวบรวมโดยไม่มีข้อร้องเรียน -PSteele
VoteCoffee

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

33

คุณควรหลีกเลี่ยงการใช้โดยเด็ดขาด IsNothing()

นี่คือเหตุผล 4 ประการจากบทความIsNothing () VS Is Nothing

  1. ที่สำคัญที่สุดIsNothing(object)มีทุกสิ่งที่ส่งผ่านมาเป็นวัตถุแม้แต่ประเภทมูลค่า! เนื่องจากประเภทค่าไม่สามารถเป็นได้Nothingจึงเป็นการตรวจสอบที่สูญเปล่าโดยสิ้นเชิง
    ใช้ตัวอย่างต่อไปนี้:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If

    สิ่งนี้จะรวบรวมและทำงานได้ดีในขณะที่สิ่งนี้:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If

    จะไม่คอมไพล์แทนคอมไพเลอร์จะเพิ่มข้อผิดพลาด:

    ตัวดำเนินการ 'Is' ไม่ยอมรับตัวถูกดำเนินการประเภท 'Integer'
    ตัวดำเนินการต้องเป็นชนิดอ้างอิงหรือเป็นโมฆะ

  2. IsNothing(object)เป็นส่วนหนึ่งของไฟล์Microsoft.VisualBasic.dll.
    นี่เป็นสิ่งที่ไม่พึงปรารถนาเนื่องจากคุณมีการพึ่งพาไลบรารี VisualBasic ที่ไม่จำเป็น

  3. มันช้า - ช้ากว่าจริง 33.76% (การทำซ้ำมากกว่า 1000000000 ครั้ง)!

  4. บางทีอาจจะเป็นความชอบส่วนบุคคล แต่IsNothing()อ่านเหมือนYoda สภาพ เมื่อคุณดูตัวแปรคุณกำลังตรวจสอบสถานะโดยที่ตัวแปรนั้นเป็นหัวข้อในการตรวจสอบของคุณ

    เช่นมันทำ x? --- ไม่เป็นxไอเอ็นจีทรัพย์สินของมัน ?

    ดังนั้นฉันคิดว่าIf a IsNot Nothingอ่านดีกว่าIf Not IsNothing(a)


29

ฉันเห็นด้วยกับ "Is Nothing" ตามที่ระบุไว้ข้างต้นการปฏิเสธด้วย "IsNot Nothing" เป็นเรื่องง่าย

หาอ่านง่ายกว่านี้ ...

If printDialog IsNot Nothing Then
    'blah
End If

กว่านี้...

If Not obj Is Nothing Then
    'blah
End If

5

VB เต็มไปด้วยสิ่งต่างๆเช่นที่พยายามทำให้ทั้ง "ชอบภาษาอังกฤษ" และสะดวกสบายสำหรับผู้ที่คุ้นเคยกับภาษาที่ใช้ () และ {} มาก ตัวอย่างเช่นในด้าน "like english" ... VB มีคีย์เวิร์ด" Ain't " ... และไม่ฉันไม่ได้ล้อเล่น และในอีกด้านหนึ่งดังที่คุณทราบอยู่แล้วส่วนใหญ่คุณสามารถใช้ () กับการเรียกใช้ฟังก์ชันได้หากต้องการ แต่ไม่จำเป็นต้องทำ

ฉันชอบ IsNothing () ... แต่ฉันใช้ C และ C # ดังนั้นนั่นคือสิ่งที่สะดวกสบาย และฉันคิดว่ามันน่าอ่านมากขึ้น แต่ไปกับสิ่งที่คุณสบายใจกว่า


3
ลิงก์ของคุณหมดแล้วดังนั้นสิ่งที่คุ้มค่าที่นี่คือสิ่งที่มีชีวิตอยู่: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/…ควรสังเกตว่าตรงกันข้ามกับความเชื่อที่เป็นที่นิยมนี้คือ ไม่จริง.
Matt Wilko

5

ฉันเอนเอียงไปทางเลือก "Is Nothing" เป็นหลักเพราะดูเหมือน OO มากกว่า

แน่นอน Visual Basic จะไม่ได้ไม่ได้เป็นคำหลัก


VB.NET สามารถทำวิธีการขยายได้หรือไม่? :)
klkitchens

2

ฉันมักจะใช้เวอร์ชัน Is Nothing เพียงบางส่วนจากการใช้งานมากที่สุดเท่าที่ฉันทำใน SQL


1

ตอนแรกฉันใช้ IsNothing แต่ฉันกำลังก้าวไปสู่การใช้ Is Nothing ในโปรเจ็กต์ใหม่ ๆ เพื่อความสามารถในการอ่านเป็นหลัก ครั้งเดียวที่ฉันติดกับ IsNothing คือถ้าฉันรักษารหัสที่ใช้ตลอดและฉันต้องการคงความสม่ำเสมอ


-2

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


นี่เป็นสิ่งที่ไม่ถูกต้อง แน่ใจหรือว่าคุณไม่ได้ทำผิดรอบ? " IsNothingมีไว้เพื่อทำงานกับชนิดการอ้างอิงประเภทค่าไม่สามารถเก็บค่าNothingและเปลี่ยนกลับเป็นค่าเริ่มต้นได้ถ้าคุณกำหนดNothing [... ] IsNothingจะส่งกลับFalseเสมอ" แต่"แสดงถึงค่าเริ่มต้นของประเภทข้อมูลใด ๆ [... ] สำหรับประเภทค่า [สิ่งนี้] ขึ้นอยู่กับว่าประเภทค่าเป็นโมฆะหรือไม่" งั้นไม่ดีกว่าเหรอ Nothing Is Nothing
underscore_d
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.