Di VB.NET, apa perbedaan antara And
dan AndAlso
? Yang mana yang harus saya gunakan?
Di VB.NET, apa perbedaan antara And
dan AndAlso
? Yang mana yang harus saya gunakan?
Jawaban:
The And
Operator mengevaluasi kedua belah pihak, di mana AndAlso
mengevaluasi sisi kanan jika dan hanya jika sisi kiri benar.
Sebuah contoh:
If mystring IsNot Nothing And mystring.Contains("Foo") Then
' bla bla
End If
Di atas melempar pengecualian jika mystring = Nothing
If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
' bla bla
End If
Yang ini tidak melempar pengecualian.
Jadi jika Anda berasal dari dunia C #, Anda harus menggunakan AndAlso
seperti yang akan Anda gunakan&&
.
Info lebih lanjut di sini: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/
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:
if x = 5 And y = 7
Memeriksa apakah x sama dengan 5, dan jika y sama dengan 7, maka dilanjutkan jika keduanya benar.
if x = 5 AndAlso y = 7
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:
If Not Object Is Nothing AndAlso Object.Load()
Jika itu digunakan And
sebagai ganti AndAlso
, itu akan tetap mencoba Object.Load()
bahkan jika itu nothing
, yang akan membuang pengecualian.
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
dan Or
di VB.NET adalah operator bit sedangkan OrElse
dan AndAlso
operator ketat Boolean.
Dim a = 3 OR 5 ' Will set a to the value 7, 011 or 101 = 111
Dim a = 3 And 5 ' Will set a to the value 1, 011 and 101 = 001
Dim b = 3 OrElse 5 ' Will set b to the value true and not evaluate the 5
Dim b = 3 AndAlso 5 ' Will set b to the value true after evaluating the 5
Dim c = 0 AndAlso 5 ' Will set c to the value false and not evaluate the 5
Catatan : bilangan bulat nol dianggap true
; Dim e = not 0
akan diatur e
untuk -1
menunjukkan Not
juga operator sedikit.
||
dan &&
(versi C # dari OrElse
dan AndAlso
) mengembalikan ekspresi yang terakhir dievaluasi yang akan 3
dan 5
masing - masing. Hal ini memungkinkan Anda menggunakan idiom v || 5
di C # untuk memberikan 5
sebagai nilai ekspresi saat v
ini null
atau ( 0
dan integer) dan nilai v
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
dan And
untuk operasi bit (integer atau Boolean). Gunakan OrElse
dan AndAlso
"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?
Dim e = Not 0 And 3
||
dan &&
dengan ??
. Meskipun ada bahasa yang ||
akan mengembalikan nilai non-falsey, C # bukan salah satu dari mereka, dan mengembalikan a bool
(kecuali untuk operator nullable yang diangkat, di mana Anda mendapatkan Nullable<bool>
hasilnya)
If Bool1 And Bool2 Then
Mengevaluasi Bool1 dan Bool2
If Bool1 AndAlso Bool2 Then
Mengevaluasi Bool2 jika dan hanya jika Bool1 benar.
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.
While File1.Seek_Next_Row() And File2.Seek_Next_Row()
Str1 = File1.GetRow()
Str2 = File2.GetRow()
End While
Menggunakan And
memastikan bahwa baris dikonsumsi setiap kali kondisi diperiksa. Sedangkan AndAlso
mungkin membaca baris terakhir File1
dan pergi File2
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.
Cara sederhana untuk memikirkannya adalah menggunakan bahasa Inggris yang lebih jelas
If Bool1 And Bool2 Then
If [both are true] Then
If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then
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:
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
...
End If
Menggunakan yang lama Dan dalam ekspresi di atas akan melempar NullReferenceException jika myObj adalah null.
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.
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.
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.
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.