IsNothing, Is Nothing


130

Burada herhangi biri VB.NET kullanıyor mu ve kullanımın IsNothingaksine Is Nothing(örneğin, If IsNothing(anObject)veyaIf anObject Is Nothing... ) mi? Öyleyse neden?

DÜZENLEME: İkisinin de eşit derecede kabul edilebilir olduğunu düşünüyorsanız, bir tanesini seçip ona bağlı kalmanın en iyisi olduğunu mu düşünüyorsunuz yoksa onları karıştırmak doğru mu?


3
Orada bir sürü kullanmaktan kaçının iyi nedenlerIsNothing()
KyleMit

@JesseChisholm, Tek bir yorum için çok fazla şey var, ancak önceki yorumum bu bağlantıyı 5 farklı yorumu sıralayan
KyleMit

Teknoloji cevaplar gerçekten ilginç, ama utanç sorusu çok açık biraz sol ve hiçbir kullanımı ile bazı cevaplar, sadece giderek belirsiz kişisel tercihi oluşturulduğu
underscore_d

Yanıtlar:


125

Yürütülürken MSIL'e bakarsanız, aynı koda göre derlenmediğini görürsünüz. IsNothing () kullandığınızda, sadece ifadeyi değerlendirmek yerine, aslında o yönteme bir çağrı yapar.

"Is Nothing" kullanmaya meyilli olmamın nedeni, olumsuzladığımda, kişisel olarak daha okunabilir olduğunu hissettiğim "Not IsNothing (nesne)" yerine "Hiçbir Şey Değil" haline gelmesidir.


46

Bunu bulmak Patrick Steele , blogunda bu soruyu en iyi cevap verdi: IsNothing kaçınmak ()

Patrick Steele'nin gönderi için övgüyü almasını sağlamak için yanıtının hiçbirini burada kopyalamadım. Ancak, Is Nothing veya IsNothing kullanıp kullanmayacağınıza karar vermeye çalışıyorsanız, onun yazısını okumalısınız. Bence Hiç Bir Şey Değil en iyi seçimdir.

Düzenle - VoteCoffe'un yorumunu burada

Kısmi makale içeriği: Daha fazla kodu inceledikten sonra, bundan kaçınmanız gereken başka bir neden buldum: Değer türlerini kabul ediyor! Açıkçası, IsNothing () bir 'nesneyi' kabul eden bir işlev olduğundan, ona istediğiniz her şeyi iletebilirsiniz. Bu bir değer türü ise, .NET onu bir nesnede kutuya alır ve IsNothing'e iletir - bu her zaman kutulu bir değerde yanlış döndürür! VB.NET derleyicisi "Hiçbir Şeydir" stil sözdizimini kontrol edecek ve bir değer türü üzerinde "Hiçbir Şey" yapmayı denediğinizde derleme yapmayacaktır. Ancak IsNothing () işlevi şikayetler olmadan derlenir. -PSteele - VoteCoffee


7
Kısmi makale içeriği: Daha fazla kodu inceledikten sonra, bundan kaçınmanız gereken başka bir neden buldum: Değer türlerini kabul ediyor! Açıkçası, IsNothing () bir 'nesneyi' kabul eden bir işlev olduğundan, ona istediğiniz her şeyi iletebilirsiniz. Bu bir değer türü ise, .NET onu bir nesnede kutuya alır ve IsNothing'e iletir - bu her zaman kutulu bir değerde yanlış döndürür! VB.NET derleyicisi "Hiçbir Şeydir" stil sözdizimini kontrol edecek ve bir değer türü üzerinde "Hiçbir Şey" yapmayı denediğinizde derleme yapmayacaktır. Ancak IsNothing () işlevi şikayetler olmadan derlenir. -PSteele
VoteCoffee

7
Bağlantının ölüp bitmeyeceğini asla bilemeyeceğiniz için içeriğin bir kısmını yayınladım ve kaplamaya iyi bir nokta kattığını düşündüm.
VoteCoffee

33

Kesinlikle kullanmaktan kaçınmalısınız IsNothing()

İşte 4 nedenleri makale dan IsNothing () VS Is Hiçbir şey

  1. En önemlisi, IsNothing(object)her şey ona bir nesne, hatta değer türleri olarak aktarıldı! Değer türleri olamayacağından Nothing, tamamen boşa harcanmış bir çek.
    Aşağıdaki örneği ele alalım:

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

    Bu derlenecek ve iyi çalışacaktır, oysa bu:

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

    Derlenmeyecek, bunun yerine derleyici hatayı artıracaktır:

    'Is' operatörü 'Tamsayı' türündeki işlenenleri kabul etmiyor.
    İşlenenler başvuru veya null yapılabilir türler olmalıdır.

  2. IsNothing(object)aslında Microsoft.VisualBasic.dll.
    VisualBasic kitaplığına gereksiz bir bağımlılığınız olduğundan bu istenmeyen bir durumdur.

  3. Yavaş -% 33,76 daha yavaş (1000000000 yinelemenin üzerinde)!

  4. Belki kişisel tercih, ama Yoda KoşuluIsNothing() gibi görünüyor . Bir değişkene baktığınızda, araştırmanızın konusu olarak onun durumunu kontrol ediyorsunuz.

    yani yapar bunu x do? --- DEĞİLxbir özelliğini ing bunun ?

    Bence If a IsNot Nothingşundan daha iyi okurIf Not IsNothing(a)


29

"Hiçbir Şey" e katılıyorum. Yukarıda belirtildiği gibi, "IsNot Nothing" ile olumsuzlamak kolaydır.

Bunu okumayı daha kolay buluyorum ...

If printDialog IsNot Nothing Then
    'blah
End If

Bundan daha...

If Not obj Is Nothing Then
    'blah
End If

5

VB, onu hem "İngilizce gibi" hem de () ve {} kullanan dillere alışkın kişiler için rahat yapmaya çalışan bunun gibi şeylerle doludur. Örneğin, "İngilizce gibi" tarafında ... VB " Değil " anahtar kelimesine sahiptir ... ve hayır, şaka yapmıyorum. Ve öte yandan, zaten bildiğiniz gibi çoğu zaman () işlevini kullanmak isterseniz işlev çağrılarıyla birlikte kullanabilirsiniz, ancak buna gerek yoktur.

IsNothing () tercih ederim ... ama C ve C # kullanıyorum, bu yüzden rahat olan bu. Ve bence daha okunabilir. Ama size daha rahat hissettiren şeyle gidin.


3
Bağlantınız öldü, bu yüzden buradaki değeri canlı bir bağlantıdır: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/… Bununla birlikte, popüler inanışın aksine bunun doğru değil.
Matt Wilko

5

"Hiçbir Şey Değildir" alternatifine doğru eğiliyorum, çünkü daha çok OO görünüyor.

Şüphesiz Visual Basic değildir anahtar değil midir aldık.


VB.NET uzatma yöntemleri yapabilir mi? :)
klkitchens

2

Ayrıca Is Nothing sürümünü kısmen SQL'de olduğu kadar kullanmaktan da kullanmaya meyilliyim.


1

Başlangıçta IsNothing kullandım ama daha yeni projelerde, özellikle okunabilirlik için Is Nothing kullanmaya doğru ilerliyorum. IsNothing'e sadık kaldığım tek zaman, kodu baştan sona kullanılan yerde tutuyor ve tutarlı kalmak istiyorum.


-2

Is Nothing, Nothing değerine atanmış bir nesneyi gerektirir. IsNothing (), sayısal tür de dahil olmak üzere başlatılmamış herhangi bir değişkeni alabilir. Bu, örneğin isteğe bağlı bir parametrenin geçilip geçilmediğini test ederken yararlıdır.


Bu yanlış. Yanlış anlamadığına emin misin? " IsNothing'in başvuru türleri üzerinde çalışması amaçlanmıştır. Bir değer türü Nothing değerini tutamaz ve Nothing [...] atarsanız, IsNothing her zaman False döndürürse varsayılan değerine geri döner ." Ancak "Herhangi bir veri türünün varsayılan değerini temsil eder. [...] Değer türleri için [bu], değer türünün null yapılabilir olup olmadığına bağlıdır." Yani daha iyi değil mi? Nothing Is Nothing
underscore_d
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.