Apa perbedaan antara And dan Andso juga di VB.NET?

250

Di VB.NET, apa perbedaan antara Anddan AndAlso? Yang mana yang harus saya gunakan?

Nakul Chaudhary
sumber

Jawaban:

380

The AndOperator mengevaluasi kedua belah pihak, di mana AndAlsomengevaluasi 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 AndAlsoseperti yang akan Anda gunakan&& .

Info lebih lanjut di sini: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/

Nico
sumber
2
Tautan "Info selengkapnya" rusak. Berikut URL baru: panopticoncentral.net/2003/08/18/…
Rory O'Kane
12
Adakah yang tahu mengapa mereka tidak memilih "AndThen"? Saya pikir ini akan lebih intuitif.
tmighty
7
Saya selalu berpikir ini kontra intuitif. Dan juga akan menyiratkan itu akan memeriksa keduanya dan ini harus sebaliknya! Karenanya mengapa saya harus datang ke SO untuk memeriksa hal-hal seperti ini (ya saya ac # guy). Anda juga seharusnya tidak perlu mengajukan pertanyaan seperti "perbedaan antara And and Andso". Terlalu banyak ands! Guru bahasa Inggris saya akan membunuh saya
Robin French
3
Kapan pun saya menggunakan OrElse, saya selalu memikirkan South Park, "Atau apa?" "Tepat"
Robin French
1
@tighty menebak bahwa itu akan menyebabkan lebih banyak kebingungan karena Thenkata kunci sendiri.
binki
29

The AndOperator 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 Andsebagai ganti AndAlso, itu akan tetap mencoba Object.Load()bahkan jika itu nothing, yang akan membuang pengecualian.

Ed Marty
sumber
14
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.
Joel Coehoorn
1
Pertama, Andalso tidak terutama digunakan untuk 'save on runtime', itu tidak masuk akal. Kedua, meminta argumen kedua melakukan beberapa 'efek samping' yang berguna adalah praktik buruk yang buruk.
Tor Haugen
2
Anda tidak dapat berdebat bahwa ini tidak 'save on runtime'. Dan saya telah menemukan situasi di mana efek samping sebenarnya, bukan praktik buruk yang buruk.
Ed Marty
1
"Umumnya orang menggunakan metode hubungan arus pendek jika ada alasan untuk secara eksplisit tidak memeriksa bagian kedua" Erm, wut? Saya berharap orang menggunakan hubungan arus pendek kecuali mereka punya alasan untuk tidak melakukannya! Tidak ada yang harus menggunakan yang lama and/ orkecuali 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 ...
underscore_d
20

Menariknya tidak ada jawaban yang menyebutkan bahwa Anddan Ordi VB.NET adalah operator bit sedangkan OrElsedan AndAlsooperator 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 0akan diatur euntuk -1menunjukkan Notjuga operator sedikit.

||dan &&(versi C # dari OrElsedan AndAlso) mengembalikan ekspresi yang terakhir dievaluasi yang akan 3dan 5masing - masing. Hal ini memungkinkan Anda menggunakan idiom v || 5di C # untuk memberikan 5sebagai nilai ekspresi saat vini nullatau ( 0dan integer) dan nilai vsebaliknya. 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 Ordan Anduntuk operasi bit (integer atau Boolean). Gunakan OrElsedan AndAlso"hubung pendek" suatu operasi untuk menghemat waktu, atau uji validitas evaluasi sebelum mengevaluasinya. If valid(evaluation) andalso evaluation thenatauif not (unsafe(evaluation) orelse (not evaluation)) then

Bonus: Berapa nilai dari yang berikut ini?

Dim e = Not 0 And 3
Charles Jacks
sumber
Saya pikir Anda sudah bingung ||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)
Ben Voigt
14
If Bool1 And Bool2 Then

Mengevaluasi Bool1 dan Bool2

If Bool1 AndAlso Bool2 Then

Mengevaluasi Bool2 jika dan hanya jika Bool1 benar.

Bryan Anderson
sumber
13

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 Andmemastikan bahwa baris dikonsumsi setiap kali kondisi diperiksa. Sedangkan AndAlsomungkin membaca baris terakhir File1dan pergi File2tanpa 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.

Ian
sumber
5

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
rbrill
sumber
3
Bahasa Inggris lebih membingungkan daripada kode karena tidak memiliki spesifikasi!
binki
5

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.

Tor Haugen
sumber
5

Lihat juga pertanyaan Stack Overflow: Haruskah saya selalu menggunakan operator AndAlso dan OrElse? .

Juga: Sebuah komentar untuk mereka yang disebutkan menggunakan Andjika 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.

Joel Coehoorn
sumber
3

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.

davidallyoung
sumber
Juga perlu disebutkan adalah IIF (Immediate If) karena tidak mengalami hubungan arus pendek dan dapat menciptakan kondisi yang sangat berbeda dengan maksud programmer, karena komponen benar dan salah dievaluasi. Sebelumnya, seseorang menyatakan bahwa mereka menggunakan perilaku efek samping ini dengan sengaja, tetapi - Saya tidak melihat itu sebagai metode yang efektif, karena Jika Segera tidak memiliki niat yang disengaja dalam melakukan evaluasi dengan cara yang dapat saya deteksi.
jinzai
"Selain jawaban di atas, Andso juga menyediakan proses pengkondisian yang dikenal sebagai hubungan arus pendek." Setiap jawaban di atas ini berfokus pada hubungan arus pendek. : P Tapi deskripsi dan rekomendasi yang bagus.
underscore_d
1

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.

Anand
sumber
0

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.

Kemangi
sumber