IsNothing versus Is Nothing


130

Apakah ada orang di sini menggunakan VB.NET dan memiliki preferensi yang kuat untuk atau menentang menggunakan IsNothingsebagai lawan Is Nothing(misalnya, If IsNothing(anObject)atau If anObject Is Nothing...)? Jika demikian, mengapa?

EDIT: Jika Anda pikir keduanya sama-sama dapat diterima, apakah Anda pikir yang terbaik untuk memilih satu dan tetap menggunakannya, atau apakah boleh mencampurnya?


3
Ada banyak alasan bagus untuk tidak menggunakanIsNothing()
KyleMit

@JesseChisholm, Ada terlalu banyak untuk satu komentar, tapi komentar saya sebelumnya memposting tautan ini ke sebuah artikel yang menyebutkan 5 yang berbeda blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit

Jawaban teknologinya benar-benar menarik, tetapi rasa malu pertanyaan itu dibiarkan terlalu terbuka dan menghasilkan beberapa jawaban tanpa digunakan, hanya preferensi pribadi yang semakin samar
underscore_d

Jawaban:


125

Jika Anda melihat MSIL saat dijalankan, Anda akan melihat bahwa MSIL tidak dikompilasi ke kode yang sama persis. Ketika Anda menggunakan IsNothing () itu benar-benar membuat panggilan ke metode itu sebagai lawan hanya mengevaluasi ekspresi.

Alasan saya cenderung cenderung menggunakan "Is Nothing" adalah ketika saya meniadakannya menjadi "IsNot Nothing" daripada "Not IsNothing (objek)" yang secara pribadi saya merasa terlihat lebih mudah dibaca.


46

Saya menemukan bahwa Patrick Steele menjawab pertanyaan ini dengan sangat baik di blognya: Avoiding IsNothing ()

Saya tidak menyalin jawaban apa pun di sini, untuk memastikan Patrick Steele mendapatkan kredit untuk jabatannya. Tapi saya pikir jika Anda mencoba memutuskan apakah akan menggunakan Is Nothing atau IsNothing Anda harus membaca postingnya. Saya pikir Anda akan setuju bahwa Is Nothing adalah pilihan terbaik.

Edit - komentar VoteCoffe di sini

Isi artikel parsial: Setelah meninjau lebih banyak kode saya menemukan alasan lain Anda harus menghindari ini: Ini menerima jenis nilai! Jelas, karena IsNothing () adalah fungsi yang menerima 'objek', Anda dapat meneruskan apa pun yang Anda inginkan. Jika itu tipe nilai, .NET akan mengotakkannya menjadi objek dan meneruskannya ke IsNothing - yang akan selalu mengembalikan false pada nilai kotak! Kompiler VB.NET akan memeriksa sintaks gaya "Tidak Ada" dan tidak akan dikompilasi jika Anda mencoba melakukan "Tidak Ada" pada tipe nilai. Tetapi fungsi IsNothing () mengkompilasi tanpa keluhan. -PSteele - VoteCoffee


7
Isi artikel parsial: Setelah meninjau lebih banyak kode saya menemukan alasan lain Anda harus menghindari ini: Ini menerima jenis nilai! Jelas, karena IsNothing () adalah fungsi yang menerima 'objek', Anda dapat meneruskan apa pun yang Anda inginkan. Jika itu tipe nilai, .NET akan mengotakkannya menjadi objek dan meneruskannya ke IsNothing - yang akan selalu mengembalikan false pada nilai kotak! Kompiler VB.NET akan memeriksa sintaks gaya "Tidak Ada" dan tidak akan dikompilasi jika Anda mencoba melakukan "Tidak Ada" pada tipe nilai. Tetapi fungsi IsNothing () mengkompilasi tanpa keluhan. -PSteele
VoteCoffee

7
Diposting beberapa konten karena Anda tidak pernah tahu apakah tautannya akan mati dan saya pikir itu menambahkan poin yang bagus untuk sampulnya.
VoteCoffee

33

Anda harus benar-benar menghindari penggunaan IsNothing()

Berikut adalah 4 alasan dari artikel IsNothing () VS Is Nothing

  1. Yang paling penting, IsNothing(object)semuanya telah diteruskan sebagai objek, bahkan tipe nilai! Karena tipe nilai tidak bisa Nothing, itu adalah cek yang benar-benar sia-sia.
    Ambil contoh berikut:

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

    Ini akan mengkompilasi dan berjalan dengan baik, sedangkan ini:

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

    Tidak akan dikompilasi, sebagai gantinya kompiler akan meningkatkan kesalahan:

    Operator 'Is' tidak menerima operan tipe 'Integer'.
    Operand harus tipe referensi atau nullable.

  2. IsNothing(object)sebenarnya merupakan bagian dari bagian Microsoft.VisualBasic.dll.
    Ini tidak diinginkan karena Anda memiliki ketergantungan yang tidak dibutuhkan pada perpustakaan VisualBasic.

  3. Ini lambat - 33,76% lebih lambat pada kenyataannya (lebih dari 1000000000 iterasi)!

  4. Mungkin preferensi pribadi, tetapi IsNothing()dibaca seperti Kondisi Yoda . Saat Anda melihat variabel yang Anda periksa statusnya, dengan itu sebagai subjek investigasi Anda.

    yaitu apakah itu dilakukan x? --- TIDAK Apakah xing milik itu ?

    Jadi saya pikir If a IsNot Nothingmembaca lebih baik daripadaIf Not IsNothing(a)


29

Saya setuju dengan "Is Nothing". Seperti yang dinyatakan di atas, mudah untuk meniadakan dengan "IsNot Nothing".

Saya menemukan ini lebih mudah dibaca ...

If printDialog IsNot Nothing Then
    'blah
End If

dari ini ...

If Not obj Is Nothing Then
    'blah
End If

5

VB penuh dengan hal-hal seperti itu yang berusaha menjadikannya "seperti bahasa Inggris" dan nyaman bagi orang-orang yang terbiasa dengan bahasa yang menggunakan () dan {} banyak. Misalnya, di sisi "seperti bahasa Inggris" ... VB memiliki kata kunci " Tidak " ... dan tidak, saya tidak bercanda. Dan di sisi lain, karena Anda mungkin sudah tahu sebagian besar waktu Anda dapat menggunakan () dengan panggilan fungsi jika Anda mau, tetapi tidak harus.

Saya lebih suka IsNothing () ... tapi saya menggunakan C dan C #, jadi hanya itu yang nyaman. Dan saya pikir itu lebih mudah dibaca. Tetapi pergi dengan apa pun yang terasa lebih nyaman bagi Anda.


3
Tautan Anda sudah mati sehingga nilainya di sini adalah tautan langsung: web.archive.org/web/20050308014055/http : //ea.3leaf.com/2004/08/... Namun perlu dicatat bahwa ini bertentangan dengan kepercayaan populer. tidak benar.
Matt Wilko

5

Saya condong ke arah alternatif "Is Nothing", terutama karena sepertinya lebih banyak OO.

Tentunya Visual Basic tidak punya kata kunci Ain't.


Bisakah VB.NET melakukan metode ekstensi? :)
klkitchens

2

Saya juga cenderung menggunakan versi Is Nothing sebagian dari menggunakannya sebanyak yang saya lakukan di SQL.


1

Saya awalnya menggunakan IsNothing tapi saya sudah bergerak ke arah menggunakan Is Nothing di proyek-proyek baru, terutama untuk keterbacaan. Satu-satunya waktu saya tetap dengan IsNothing adalah jika saya mempertahankan kode di mana itu digunakan sepanjang dan saya ingin tetap konsisten.


-2

Is Nothing memerlukan objek yang telah ditetapkan ke nilai Nothing. IsNothing () dapat mengambil variabel apa pun yang belum diinisialisasi, termasuk tipe numerik. Ini berguna misalnya saat menguji apakah parameter opsional telah lulus.


Ini salah. Apakah Anda yakin Anda tidak salah mengerti? " IsNothing dimaksudkan untuk bekerja pada tipe referensi. Tipe nilai tidak dapat menyimpan nilai Nothing dan kembali ke nilai defaultnya jika Anda menetapkan Nothing [...] IsNothing selalu mengembalikan False ." Tetapi "Merupakan nilai default dari semua tipe data. [...] Untuk tipe nilai, [ini] tergantung pada apakah tipe nilai tersebut dapat dibatalkan." Jadi bukankah lebih baik? Nothing Is Nothing
underscore_d
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.