OrElse
adalah operator korsleting , Or
bukan.
Menurut definisi operator boolean 'atau', jika suku pertama Benar maka keseluruhannya pasti benar - jadi kita tidak perlu mengevaluasi suku kedua.
OrElse
mengetahui hal ini, jadi jangan mencoba dan mengevaluasi temp = 0
setelah itu ditetapkantemp Is DBNull.Value
Or
tidak mengetahui hal ini, dan akan selalu berusaha mengevaluasi kedua istilah tersebut. Ketika temp Is DBNull.Value
, tidak bisa dibandingkan dengan nol, jadi jatuh.
Anda harus menggunakan ... yah, mana saja yang masuk akal.
Ini adalah perilaku yang sama seperti pada C #, di mana setiap orang menggunakan Coditional Or (||) dan Conditional And (&&), di mana Anda juga memiliki Or (|) dan normal And (&). Jadi membandingkan C # dengan VB.Net adalah:
| => Atau
|| => Atau Lain
& => Dan
&& => Dan Juga
Operator boolean bersyarat sangat berguna untuk mencegah bersarang jika ada konstruksi. Namun terkadang operator boolean normal diperlukan untuk memastikan mencapai kedua jalur kode.
sumber
|
dan&
operator bitwise di C #, bukan operasi boolean sama sekali.OrElse dihubung pendek , ini berarti bahwa hanya satu sisi ekspresi yang akan diuji jika sisi pertama cocok.
Sama seperti AndAlso hanya akan menguji satu sisi ekspresi jika paruh pertama gagal.
sumber
(Saya telah melihat jawaban lain dan menyadari bahwa saya sangat salah)
Operator OrElse "melakukan disjungsi logika hubung singkat pada dua ekspresi", artinya: jika operan kiri benar dan seluruh ekspresi dijamin benar, operan kanan bahkan tidak akan dievaluasi (ini berguna dalam kasus seperti:
untuk menghindari lemparan NullReferenceException oleh operan kanan.
Saya sangat heran bahwa ini ( evaluasi malas ) bukanlah perilaku default
or
danand
seperti di C / C ++ dan C # (dan banyak bahasa lainnya ...)sumber
OrElse mengevaluasi ekspresi pertama kemudian jika benar itu akan melanjutkan ke pernyataan sementara OR mengevaluasi dua ekspresi sebelum akan melanjutkan ke pernyataan mereka.
Contoh:
Menggunakan OrElse
Hasilnya: BENAR
Menggunakan ATAU
Hasilnya adalah: Error tidak dapat mengubah string menjadi double.
sumber
Jawaban Bert tidak terlalu akurat. '|' atau '&' adalah operator logika, di C #, ini selalu diperlakukan sebagai operator bit, lihat kode berikut sebagai contoh
Berikut ini adalah IL
saat kamu menggunakan || untuk menguji "a == null" dan "a.ToString () ==" sdffd ", IL akan
Sekarang Anda dapat melihat perbedaannya, tolong jangan pikirkan '|' atau 'dan' sebagai operator bersyarat, itu hanya operator logis, saya rasa tidak perlu menggunakannya untuk menilai kondisi
sumber
The '|' or '&' is logical operator, in C #, it always treat as bit operator
. Saya percaya akan hal ini juga, sampai saya melihat referensi ini, msdn.microsoft.com/en-us/library/kxszd0kx.aspxKecuali logika kode Anda memerlukan perilaku hubungan arus pendek yang disediakan OrElse, saya akan cenderung menggunakan operator Or karena:
sumber
Alasan kompilasi gagal dalam contoh adalah urutan operasi.
Pengurai ekspresi mencoba mengevaluasi "dbnull.value atau temp" terlebih dahulu.
Kesalahannya ada di sini, karena Anda tidak dapat melakukan bitwise OR antara integer (temp) dan dbnull.value.
OrElse memperbaiki ini, bukan karena hubung singkatnya, tetapi karena urutan operasinya lebih rendah , sehingga "temp is dbnull.value" dan "3 = 0" sedang dievaluasi terlebih dahulu, daripada parser yang mencoba membandingkan dbNull dan suhu
Jadi evaluasi dengan OrElse berfungsi seperti yang Anda harapkan: (asumsikan temp = 3)
Ini sebenarnya adalah ujian masuk di perusahaan perangkat lunak tempat saya dulu bekerja, dan itu adalah masalah umum yang biasa saya temui di VB6. Jadi, sebaiknya beri tanda kurung pada sub-ekspresi Anda saat menggunakan operator boolean:
Ini akan dikompilasi dengan benar:
Meskipun, seperti yang telah ditunjukkan oleh semua orang, OrElse dan AndAlso sebenarnya adalah operator yang tepat untuk digunakan dalam konteks ini.
sumber