VB.NET'te And ve AndAlso arasındaki fark nedir?


Yanıtlar:


380

AndOperatör her iki tarafı da, değerlendirir nerede AndAlsodeğerlendirir sağ taraf ise ve sol tarafında doğru olmasıdır.

Bir örnek:

If mystring IsNot Nothing And mystring.Contains("Foo") Then
  ' bla bla
End If

Yukarıdaki durum bir istisna atarsa mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
  ' bla bla
End If

Bu bir istisna oluşturmaz.

Yani C # dünyasından geliyorsanız, kullandığınız AndAlsogibi kullanmalısınız &&.

Daha fazla bilgi için: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/


2
"Daha fazla bilgi" bağlantısı bozuk. İşte yeni URL: panopticoncentral.net/2003/08/18/…
Rory O'Kane

12
Bunun yerine neden "AndThen" i seçmediklerini bilen var mı? Bunun daha sezgisel olacağını düşünüyorum.
tmighty

7
Her zaman bunun sezgisel olduğunu düşündüm. Ayrıca, her ikisini de kontrol edeceğini ima ederdi ve bu başka bir yol olmalı! Bu yüzden neden böyle şeyleri kontrol etmek için SO'ya gelmeliyim (evet ben ac # guy). Ayrıca "And ile AndAso arasındaki fark" gibi bir soru sormak zorunda kalmamalısınız. Çok fazla ands! İngilizce öğretmenim beni öldürürdü
Robin French

3
Ne zaman OrElse kullanırsam hep South Park'ı düşünürüm "Yoksa başka ne?" "Kesinlikle"
Robin French

1
@tmighty Then, kendi anahtar kelimesi olduğu için daha fazla karışıklığa neden olacağını tahmin ediyor .
binki

29

AndO Koşul yanlışsa biliyorsa AndAlso operatörü duracaktır oysa operatör, devam etmeden önce açıklamada bütün koşulları kontrol edecektir. Örneğin:

if x = 5 And y = 7

X'in 5'e eşit olup olmadığını ve y'nin 7'ye eşit olup olmadığını kontrol eder, her ikisi de doğruysa devam eder.

if x = 5 AndAlso y = 7

X'in 5'e eşit olup olmadığını kontrol eder. Değilse, y'nin 7 olup olmadığını kontrol etmez, çünkü durumun zaten yanlış olduğunu bilir. (Buna kısa devre denir.)

Genellikle, birinci bölüm doğru değilse ikinci bölümü açıkça kontrol etmemek için bir neden varsa, insanlar kısa devre yöntemini kullanırlar, örneğin kontrol edilirse bir istisna atarlar. Örneğin:

If Not Object Is Nothing AndAlso Object.Load()

AndBunun yerine kullanılırsa AndAlso, istisna atacak Object.Load()olsa bile yine de denemeye çalışır nothing.


14
Sağ tarafın ihtiyacınız olan bir yan etkisi varsa, "Ve" yerine sol tarafa getirin. Her iki tarafın da yan etkileri varsa, sadece gerçekten "Ve" ye ihtiyacınız vardır . Ve eğer bu kadar çok yan etkiniz varsa, muhtemelen yanlış bir şey yapıyorsunuzdur.
Joel Coehoorn

1
Birincisi, Andalso öncelikle 'çalışma zamanında tasarruf' için kullanılmaz, bu saçma. İkincisi, ikinci argümanın yararlı bir 'yan etki' gerçekleştirmesi çirkin eşek kötü uygulamasıdır.
Tor Haugen

2
Yine de 'çalışma zamanında kaydetme' olduğunu iddia edemezsiniz. Ve çirkin eşek kötü uygulama değil, aslında yan etkilerin olduğu durumlar buldum.
Ed Marty

1
"İkinci kısmı açıkça kontrol etmemek için bir neden varsa genellikle insanlar kısa devre yöntemini kullanırlar" Erm, wut? Umarım insanlar bir nedenleri olmadıkça kısa devre kullanırlar! Hiç kimse eski kullanmamalı and/ orbir nedeni olmadıkça - meşru olanların az ve çok arasında olduğunu düşünüyorum. Şüphesiz, diğer birçok dilin varsayılan olarak kısa devre yapmasının bir nedeni vardır: Potansiyel olarak maliyetli ifadeleri hiçbir şeye katkıda bulunmadıklarında değerlendirmezken sonuç hissini korur. Koşullarda saklayıcı yan etkiler, iyi, yan gözlü olmalıdır. Ama bu sadece benim fikrim ...
underscore_d

20

İlginçtir cevapların hiçbiri belirtti Andve Orbuna biraz operatörleri VB.NET içinde OrElseve AndAlsokesinlikle Boole operatörleri bulunmaktadır.

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

Not : sıfır olmayan bir tamsayı dikkate alınır true; Dim e = not 0koyacaktır eiçin -1gösteren Not, aynı zamanda biraz operatörüdür.

||ve &&(C # sürümleri OrElseve AndAlso) sırasıyla 3ve olacak son değerlendirilen ifadeyi döndürür 5. Bu deyim kullanmanızı sağlar v || 5vermek C # içinde 5zaman ifadenin değeri olarak vise nullya da ( 0ve bir tamsayı) ve değeri vaksi. Anlambilimdeki fark, bu "varsayılan değer deyimi" VB.NET'te çalışmadığından, VB.NET'te koruma dışında bir C # programcısı yakalayabilir.

Yani, soruyu cevaplamak için kullanın: Orve Andbiraz işlemleri (tamsayı veya Boolean) için. Kullanım OrElseve AndAlso"kısa devre" bir operasyon için zaman kazanmak, ya da değerlendirerek önce bir değerlendirmenin geçerliliğini test etmek. If valid(evaluation) andalso evaluation thenveyaif not (unsafe(evaluation) orelse (not evaluation)) then

Bonus: Aşağıdakilerin değeri nedir?

Dim e = Not 0 And 3

Ne karıştı düşünüyorum ||ve &&birlikte ??. ||Falsey olmayan değeri döndürecek diller olsa da , C # bunlardan biri değildir ve bool(bir Nullable<bool>sonuç aldığınız kaldırılabilir null olabilecek operatörler hariç) döndürür
Ben Voigt

14
If Bool1 And Bool2 Then

Hem Bool1 hem de Bool2'yi değerlendirir

If Bool1 AndAlso Bool2 Then

Bool2'yi yalnızca Bool1 doğruysa değerlendirir.


13

Sadece yan etkilerin kötü olduğunu söyleyen herkes için: bir durumda iki yan etkinin iyi olduğu bir yer, iki dosya nesnesini birlikte okumak olacaktır.

While File1.Seek_Next_Row() And File2.Seek_Next_Row()
    Str1 = File1.GetRow()
    Str2 = File2.GetRow()
End While

Kullanıldığında, Anddurum her kontrol edildiğinde bir satırın tüketilmesini sağlar. Halbuki AndAlsoson satırını okuyabilir File1ve File2tükenmiş bir satır olmadan ayrılabilir .

Tabii ki yukarıdaki kod işe yaramaz, ama ben her zaman böyle yan etkileri kullanmak ve bazı inanmak yol açacağı gibi " kötü " veya " kötü " kodu düşünün olmaz. Okuması kolay ve verimlidir.


5

Bunu düşünmenin basit bir yolu bile plainer English kullanmaktır

If Bool1 And Bool2 Then
If [both are true] Then


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then

3
İngilizce koddan daha kafa karıştırıcı çünkü bir özelliği yok!
binki

5

AndA, And'a çok benzer, ancak C #, C ++ vb.

Fark şu ki, eğer birinci fıkra (AndAlso'dan önceki) doğru ise, ikinci fıkra asla değerlendirilmez - bileşik mantıksal ifade "kısa devre" dir.

Bu bazen çok yararlıdır, örneğin:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
   ...
End If

MyObj null olsaydı, eski ve yukarıdaki ifadede bir NullReferenceException kurar.


5

Ayrıca bkz. Yığın Taşması sorusu: Her zaman AndAlso ve OrElse işleçlerini kullanmalı mıyım? .

Ayrıca: Andİfadenin sağ tarafının ihtiyacınız olan bir yan etkisi varsa kullanarak bahsedenler için bir yorum :

Sağ tarafın ihtiyacınız olan bir yan etkisi varsa, "Ve" yerine sol tarafa getirin. Her iki tarafın da yan etkileri varsa, sadece gerçekten "Ve" ye ihtiyacınız vardır . Ve eğer bu kadar çok yan etkiniz varsa, muhtemelen yanlış bir şey yapıyorsunuzdur. Genel olarak, AndAlso'yu gerçekten tercih etmelisiniz.


3

Yukarıdaki cevaplara ek olarak, AndAlso kısa devre olarak bilinen bir koşullandırma işlemi sağlar. Birçok programlama dili vb.net gibi yerleşik bu işlevselliğe sahiptir ve gereksiz durumdaki değerlendirmeleri keserek uzun koşullu ifadelerde önemli performans artışları sağlayabilir.

Başka bir benzer koşul, sadece sol koşul yanlışsa doğru koşulu kontrol eden OrElse koşulu olup, gerçek bir durum bulunduktan sonra gereksiz durum kontrollerini keser.

Her zaman kısa devre süreçlerini kullanmanızı ve koşullu ifadelerinizi bundan en iyi şekilde yararlanabilecek şekilde yapılandırmanızı öneririm. Örneğin, en verimli ve en hızlı koşullarınızı ilk önce test edin, böylece uzun koşullarınızı sadece diğer zamanlarda kesinlikle ve kısa devre yapmanız gerektiğinde çalıştırırsınız.


Ayrıca bahsetmeye değer IIF (Hemen If), çünkü kısa devre yapmaz ve hem doğru hem de yanlış bileşenler değerlendirildiği için programlayıcının niyetinden farklı koşullar oluşturabilir. Daha önce, birisi bu yan etki davranışını kasıtlı olarak kullandıklarını ifade etti, ancak - Bunu, etkili bir yöntem olarak görmüyorum, çünkü Anlık If'in değerlendirmeyi tespit edebileceğim şekilde gerçekleştirme amaçlı bir amacı yok.
jinzai

"Yukarıdaki yanıtlara ek olarak, AndAlso kısa devre olarak bilinen bir koşullandırma süreci sağlar." Bunun üzerindeki her cevap kısa devreye odaklanır. : P Ama iyi açıklama ve öneriler.
underscore_d

1

Çoğumuz için OrElse ve AndAlso birkaç kafa karıştırıcı istisna hariç (H ve / veya kullanmak zorunda kalabileceğimiz% 1'den az) hile yapacağız.

Boole mantıklarını gösteren ve bir roket bilimi gibi görünen insanlar tarafından taşınmamaya çalışın.

Oldukça basit ve basittir ve bazen sisteminiz beklendiği gibi çalışmayabilir, çünkü ilk etapta mantığınızı sevmez. Ve yine de beyniniz size mantığının% 100 test edildiğini ve kanıtlandığını ve çalışması gerektiğini söylüyor. O anda beyninize güvenmeyi bırakın ve tekrar düşünmesini isteyin ya da (OrElse ya da OrElse değil) kendinizi fazla mantık gerektirmeyen başka bir iş aramaya zorlarsınız.


0

Kodlarla değil kelimelerle anlamak için:

Kullanım Durumu:
“And” ile derleyici tüm koşulları kontrol edecektir, bu nedenle bir nesnenin “Nothing” olup olmadığını kontrol ediyorsanız ve özelliklerinden birini kontrol ederseniz, çalışma zamanı hatası alırsınız.
Ama AndAlso ile ilk "yanlış" koşullarında bir sonrakini kontrol edecek, böylece bir hata olmayacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.