VB.NET'te And
ve arasındaki fark AndAlso
nedir? Hangisini kullanmalıyım?
VB.NET'te And
ve arasındaki fark AndAlso
nedir? Hangisini kullanmalıyım?
Yanıtlar:
And
Operatör her iki tarafı da, değerlendirir nerede AndAlso
değ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 AndAlso
gibi kullanmalısınız &&
.
Daha fazla bilgi için: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/
Then
, kendi anahtar kelimesi olduğu için daha fazla karışıklığa neden olacağını tahmin ediyor .
And
O 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()
And
Bunun yerine kullanılırsa AndAlso
, istisna atacak Object.Load()
olsa bile yine de denemeye çalışır nothing
.
and
/ or
bir 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 ...
İlginçtir cevapların hiçbiri belirtti And
ve Or
buna biraz operatörleri VB.NET içinde OrElse
ve AndAlso
kesinlikle 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 0
koyacaktır e
için -1
gösteren Not
, aynı zamanda biraz operatörüdür.
||
ve &&
(C # sürümleri OrElse
ve AndAlso
) sırasıyla 3
ve olacak son değerlendirilen ifadeyi döndürür 5
. Bu deyim kullanmanızı sağlar v || 5
vermek C # içinde 5
zaman ifadenin değeri olarak v
ise null
ya da ( 0
ve bir tamsayı) ve değeri v
aksi. 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: Or
ve And
biraz işlemleri (tamsayı veya Boolean) için. Kullanım OrElse
ve 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 then
veyaif not (unsafe(evaluation) orelse (not evaluation)) then
Bonus: Aşağıdakilerin değeri nedir?
Dim e = Not 0 And 3
||
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
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.
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, And
durum her kontrol edildiğinde bir satırın tüketilmesini sağlar. Halbuki AndAlso
son satırını okuyabilir File1
ve File2
tü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.
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.
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.
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.
Ç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.
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.