Secara berkala, saya bertanya-tanya tentang ini:
Hubung-pendek ATAU akan selalu mengembalikan nilai yang sama dengan yang akan dilakukan oleh operator ATAU unortort?
Saya berharap bahwa hubungan arus pendek ATAU akan selalu mengevaluasi lebih cepat. Jadi, apakah operator OR yang tidak bersirkulasi pendek termasuk dalam bahasa C # untuk konsistensi?
Apa yang saya lewatkan?
f()
menimbulkan pengecualian, pertimbangkantrue || f()
dantrue | f()
. Apakah Anda melihat perbedaannya? Ekspresi mantan mengevaluasitrue
, evaluasi yang terakhir menghasilkan pengecualian yang dilemparkan.Jawaban:
Kedua operan dimaksudkan untuk hal yang berbeda, berasal dari C yang tidak memiliki tipe boolean. Versi hubung singkat || hanya bekerja dengan boolean, sedangkan versi hubung singkat | bekerja dengan tipe integral, melakukan bitwise atau. Itu hanya terjadi untuk bekerja sebagai operasi logis hubung singkat untuk boolean yang diwakili oleh bit tunggal, menjadi 0 atau 1.
http://en.wikibooks.org/wiki/C_Sharp_Programming/Operators#Logical
sumber
|
operator, ketika diterapkan pada dua nilai boolean, dikompilasi ke dalamor
operator yang sama di CIL seperti ketika diterapkan pada dua nilai integer - tidak seperti||
yang dikompilasi ke dalam CIL menggunakanbrtrue
kondisional melompat.|
(bitwise-atau) harus bukan hubung singkat untuk tipe sepertiint
. Itu karena di hampir semua kasus, Anda perlu menghitung kedua sisi|
ekspresi untuk menghitung hasil yang benar. Misalnya, apa hasilnya7 | f(x)
?Jika
f(x)
tidak dievaluasi, Anda tidak tahu.Lebih jauh lagi, akan menjadi tidak konsisten untuk membuat hubung singkat bagi operator ini
bool
, ketika itu adalah hubung singkat untukint
. Ngomong-ngomong, saya pikir saya tidak pernah|
sengaja menggunakan perbandingan logis, merasa sangat tidak nyaman untuk berbicara|
sebagai operator yang logis.||
namun untuk perbandingan logis, di mana evaluasi hubung singkat berfungsi dengan baik.Hal yang sama berlaku bahkan untuk C dan C ++, di mana asal dari operator tersebut.
sumber
Ini benar, operator OR hubung singkat (||) akan selalu mengembalikan nilai yang sama dengan operator OR hubung-pendek (|). (*)
Namun, jika operan pertama benar, operator hubung singkat tidak akan menyebabkan evaluasi operan kedua, sedangkan operator non-hubung singkat akan selalu menyebabkan evaluasi kedua operan. Ini dapat berdampak pada kinerja, dan kadang-kadang dalam efek samping.
Jadi, ada gunanya untuk keduanya: jika Anda peduli untuk kinerja, dan evaluasi operan kedua tidak menghasilkan efek samping, (atau jika Anda tidak peduli tentang mereka), maka tentu saja gunakan operator hubung singkat . Tetapi jika karena alasan tertentu Anda memerlukan efek samping dari operan kedua, maka Anda harus menggunakan operator hubung singkat.
Contoh di mana Anda harus menggunakan operator hubung singkat:
(*) Kecuali untuk beberapa skenario yang benar-benar menyimpang di mana evaluasi operan pertama menjadi penyebab salah dengan efek samping operan kedua untuk mengevaluasi ke true, bukan false.
sumber
Akan ada 2 alasan untuk menggunakan varian non-shortcircuit:
menjaga efek samping (tapi itu lebih jelas untuk dikodekan dengan variabel sementara)
menggagalkan serangan waktu dengan menghindari garpu di hubung singkat (ini bahkan dapat meningkatkan efisiensi runtime jika operan kedua adalah variabel tetapi itu adalah mikro-optimasi yang mungkin dilakukan kompiler)
sumber
jika klausa kanan operator memiliki efek samping, dan pemrogram bermaksud bahwa ia ingin kedua efek samping terjadi sebelum memeriksa nilai pengembaliannya.
sumber