Di VB.NET, apa perbedaan antara And
dan AndAlso
? Yang mana yang harus saya gunakan?
vb.net
short-circuiting
Nakul Chaudhary
sumber
sumber
Then
kata kunci sendiri.The
And
Operator akan memeriksa semua kondisi dalam pernyataan sebelum melanjutkan, sedangkan operator Andalso akan berhenti jika ia tahu kondisi salah. Sebagai contoh:Memeriksa apakah x sama dengan 5, dan jika y sama dengan 7, maka dilanjutkan jika keduanya benar.
Memeriksa apakah x sama dengan 5. Jika tidak, ia tidak memeriksa apakah y adalah 7, karena ia tahu bahwa kondisinya sudah salah. (Ini disebut hubungan arus pendek.)
Umumnya orang menggunakan metode hubungan arus pendek jika ada alasan untuk secara eksplisit tidak memeriksa bagian kedua jika bagian pertama tidak benar, seperti jika akan membuang pengecualian jika dicentang. Sebagai contoh:
Jika itu digunakan
And
sebagai gantiAndAlso
, itu akan tetap mencobaObject.Load()
bahkan jika itunothing
, yang akan membuang pengecualian.sumber
and
/or
kecuali mereka memiliki alasan - yang saya pikir yang sah sedikit & jauh di antara keduanya. Tentunya ada alasan mengapa sebagian besar bahasa lainnya mengalami korsleting secara default: ini mempertahankan rasa hasil sementara tidak mengevaluasi ekspresi yang berpotensi mahal ketika mereka tidak berkontribusi apa pun. Menyimpan efek samping dalam kondisi harus, baik, bermata samping. Tapi itu hanya pendapat saya ...Menariknya tidak ada jawaban yang menyebutkan bahwa
And
danOr
di VB.NET adalah operator bit sedangkanOrElse
danAndAlso
operator ketat Boolean.Catatan : bilangan bulat nol dianggap
true
;Dim e = not 0
akan diature
untuk-1
menunjukkanNot
juga operator sedikit.||
dan&&
(versi C # dariOrElse
danAndAlso
) mengembalikan ekspresi yang terakhir dievaluasi yang akan3
dan5
masing - masing. Hal ini memungkinkan Anda menggunakan idiomv || 5
di C # untuk memberikan5
sebagai nilai ekspresi saatv
ininull
atau (0
dan integer) dan nilaiv
sebaliknya. Perbedaan dalam semantik dapat menangkap programmer C # mencoba-coba VB.NET lengah karena "idiom nilai default" ini tidak berfungsi di VB.NET.Jadi, untuk menjawab pertanyaan : Gunakan
Or
danAnd
untuk operasi bit (integer atau Boolean). GunakanOrElse
danAndAlso
"hubung pendek" suatu operasi untuk menghemat waktu, atau uji validitas evaluasi sebelum mengevaluasinya.If valid(evaluation) andalso evaluation then
atauif not (unsafe(evaluation) orelse (not evaluation)) then
Bonus: Berapa nilai dari yang berikut ini?
sumber
||
dan&&
dengan??
. Meskipun ada bahasa yang||
akan mengembalikan nilai non-falsey, C # bukan salah satu dari mereka, dan mengembalikan abool
(kecuali untuk operator nullable yang diangkat, di mana Anda mendapatkanNullable<bool>
hasilnya)Mengevaluasi Bool1 dan Bool2
Mengevaluasi Bool2 jika dan hanya jika Bool1 benar.
sumber
Hanya untuk semua orang yang mengatakan efek samping itu jahat: tempat di mana memiliki dua efek samping dalam satu kondisi yang baik akan membaca dua objek file secara bersamaan.
Menggunakan
And
memastikan bahwa baris dikonsumsi setiap kali kondisi diperiksa. SedangkanAndAlso
mungkin membaca baris terakhirFile1
dan pergiFile2
tanpa baris yang dikonsumsi.Tentu saja kode di atas tidak akan berfungsi, tetapi saya menggunakan efek samping seperti ini setiap saat dan tidak akan menganggapnya sebagai kode " buruk " atau " jahat " karena beberapa akan membuat Anda percaya. Mudah dibaca dan efisien.
sumber
Cara sederhana untuk memikirkannya adalah menggunakan bahasa Inggris yang lebih jelas
sumber
AndJuga mirip dengan Dan, kecuali berfungsi seperti && di C #, C ++, dll.
Perbedaannya adalah bahwa jika klausa pertama (yang sebelum AndAlso) benar, klausa kedua tidak pernah dievaluasi - ekspresi logis majemuk adalah "hubung singkat".
Ini kadang-kadang sangat berguna, misalnya dalam ekspresi seperti:
Menggunakan yang lama Dan dalam ekspresi di atas akan melempar NullReferenceException jika myObj adalah null.
sumber
Lihat juga pertanyaan Stack Overflow: Haruskah saya selalu menggunakan operator AndAlso dan OrElse? .
Juga: Sebuah komentar untuk mereka yang disebutkan menggunakan
And
jika sisi kanan ekspresi memiliki efek samping yang Anda butuhkan:Jika sisi kanan memiliki efek samping yang Anda butuhkan, cukup pindahkan ke sisi kiri daripada menggunakan "Dan". Anda hanya perlu "Dan" jika kedua belah pihak memiliki efek samping. Dan jika Anda memiliki banyak efek samping yang terjadi, Anda mungkin melakukan sesuatu yang salah. Secara umum, Anda benar-benar harus memilih AndAlso.
sumber
Selain jawaban di atas, AndAlso juga menyediakan proses pengkondisian yang dikenal sebagai hubungan arus pendek. Banyak bahasa pemrograman memiliki fungsi ini dibangun seperti vb.net tidak, dan dapat memberikan peningkatan kinerja yang substansial dalam pernyataan kondisi panjang dengan memotong evaluasi yang tidak perlu.
Kondisi serupa lainnya adalah kondisi OrElse yang hanya akan memeriksa kondisi yang tepat jika kondisi sebelah kiri salah, sehingga tidak perlu memeriksa kondisi yang tidak perlu setelah kondisi yang sebenarnya ditemukan.
Saya akan menyarankan Anda untuk selalu menggunakan proses hubungan arus pendek dan menyusun pernyataan bersyarat Anda dengan cara yang bisa mendapatkan manfaat paling banyak dari ini. Misalnya, uji kondisi Anda yang paling efisien dan tercepat terlebih dahulu sehingga Anda hanya menjalankan kondisi panjang ketika Anda benar-benar harus dan korsleting di waktu lain.
sumber
Untuk sebagian besar dari kita, OrElse dan Andso juga akan melakukan trik kecuali beberapa pengecualian yang membingungkan (kurang dari 1% di mana kita mungkin harus menggunakan Or dan Dan).
Cobalah untuk tidak terbawa oleh orang-orang yang memamerkan logika boolean mereka dan membuatnya terlihat seperti ilmu roket.
Ini sangat sederhana dan lurus ke depan dan kadang-kadang sistem Anda mungkin tidak berfungsi seperti yang diharapkan karena tidak menyukai logika Anda sejak awal. Namun otak Anda terus memberi tahu Anda bahwa logikanya 100% diuji dan terbukti dan itu harus bekerja. Pada saat itu juga berhenti mempercayai otak Anda dan minta dia berpikir lagi atau (bukan OrElse atau mungkin OrElse), Anda memaksakan diri untuk mencari pekerjaan lain yang tidak memerlukan banyak logika.
sumber
Untuk memahami dengan kata-kata bukan kode:
Gunakan Kasus:
Dengan "Dan" kompiler akan memeriksa semua kondisi jadi jika Anda memeriksa bahwa suatu objek bisa menjadi "Tidak Ada" dan kemudian Anda memeriksa salah satu properti itu, Anda akan memiliki kesalahan run time.
Tetapi dengan AndAlso dengan "false" pertama dalam kondisi itu akan memeriksa yang berikutnya sehingga Anda tidak akan memiliki kesalahan.
sumber