W VB.NET, jaka jest różnica między And
i AndAlso
? Z którego powinienem korzystać?
vb.net
short-circuiting
Nakul Chaudhary
źródło
źródło
Then
jest to jego własne słowo kluczowe.And
Operator sprawdzi wszystkie warunki w sprawozdaniu przed kontynuowaniem, natomiast operator AndAlso zatrzyma, jeśli wie, że warunek jest fałszywy. Na przykład:Sprawdza, czy x jest równe 5, a jeśli y jest równe 7, a następnie kontynuuje, jeśli oba są prawdziwe.
Sprawdza, czy x jest równe 5. Jeśli nie, nie sprawdza, czy y wynosi 7, ponieważ wie, że warunek jest już fałszywy. (Nazywa się to zwarciem.)
Zasadniczo ludzie używają metody zwarcia, jeśli istnieje powód, aby wyraźnie nie sprawdzać drugiej części, jeśli pierwsza część nie jest prawdziwa, na przykład, gdyby w przypadku sprawdzenia sprawdziłaby wyjątek. Na przykład:
Jeśli użyłby tego
And
zamiastAndAlso
, nadal próbowałby,Object.Load()
nawet gdyby tak byłonothing
, co spowodowałoby wyjątek.źródło
and
/or
chyba, że ma powód - z którego uważam, że uzasadnionych jest niewiele i jest daleko od siebie. Z pewnością jest powód, dla którego większość innych języków domyślnie zwiera: zachowuje sens wyniku, nie oceniając potencjalnie kosztownych wyrażeń, gdy nic nie wnoszą. Ukrywanie efektów ubocznych w warunkach powinno być, no cóż, bocznymi oczami. Ale to tylko moja opinia ...Co ciekawe żadna z odpowiedzi nie wspomniano, że
And
iOr
w VB.NET są operatory bitowe podczas gdyOrElse
iAndAlso
są ściśle operatorów logicznych.Uwaga : rozważana jest niezerowa liczba całkowita
true
;Dim e = not 0
zestawe
do-1
demonstracjiNot
jest również operatorem bitowym.||
i&&
(C # wersjiOrElse
aAndAlso
) zwracają ostatni z wyrażenia który byłby3
i5
odpowiednio. Pozwala to użyć idiomuv || 5
w języku C #, aby podać5
jako wartość wyrażenia, gdyv
jestnull
lub (0
i liczbę całkowitą), a także wartość wv
przeciwnym razie. Różnica w semantyce może zaskoczyć programistę C # w VB.NET, ponieważ ten „idiom wartości domyślnej” nie działa w VB.NET.Tak więc, aby odpowiedzieć na pytanie : Użyj
Or
iAnd
do operacji bitowych (liczba całkowita lub wartość logiczna). UżyjOrElse
iAndAlso
„zewrzyj” operację, aby zaoszczędzić czas, lub przetestuj ważność oceny przed jej oceną.If valid(evaluation) andalso evaluation then
lubif not (unsafe(evaluation) orelse (not evaluation)) then
Bonus: Jaka jest wartość następujących rzeczy?
źródło
||
i&&
z??
. Podczas gdy istnieją języki, w których||
zwracana jest wartość non-falsey, C # nie jest jednym z nich i zwraca abool
(z wyjątkiem podniesionych operatorów zerowalnych, w których można uzyskaćNullable<bool>
wynik)Ocenia zarówno Bool1, jak i Bool2
Ocenia Bool2 wtedy i tylko wtedy, gdy Bool1 jest prawdziwy.
źródło
Tylko dla wszystkich tych, którzy twierdzą, że skutki uboczne są złe: miejscem, w którym dobre są dwa skutki uboczne w jednym stanie, czytałoby się dwa obiekty pliku w tandemie.
Użycie polecenia
And
gwarantuje, że wiersz jest zużywany za każdym razem, gdy sprawdzany jest warunek. NatomiastAndAlso
może odczytać ostatni wierszFile1
i wyjśćFile2
bez zużytej linii.Oczywiście powyższy kod nie działałby, ale ciągle używam takich efektów ubocznych i nie uważam go za kod „ zły ” lub „ zły ”, jak niektórzy moglibyście w to uwierzyć. Jest łatwy do odczytania i wydajny.
źródło
Prostym sposobem na przemyślenie tego jest użycie prostszego języka angielskiego
źródło
AndAlso jest bardzo podobny do And, z tym wyjątkiem, że działa jak && w C #, C ++ itp.
Różnica polega na tym, że jeśli pierwsza klauzula (przed AndAlso) jest prawdziwa, druga klauzula nigdy nie jest oceniana - złożone wyrażenie logiczne jest „zwarte”.
Jest to czasami bardzo przydatne, np. W wyrażeniu takim jak:
Użycie starego wyrażenia „I” w powyższym wyrażeniu spowodowałoby wygenerowanie wyjątku NullReferenceException, gdyby myObj miały wartość NULL.
źródło
Zobacz także pytanie Przepełnienie stosu: czy zawsze powinienem używać operatorów AndAlso i OrElse? .
Ponadto: komentarz dla tych, którzy wspominali o używaniu,
And
jeśli prawa strona wyrażenia ma efekt uboczny, którego potrzebujesz:Jeśli prawa strona ma efekt uboczny, którego potrzebujesz, po prostu przenieś go na lewą stronę zamiast używać „I”. Naprawdę potrzebujesz „I”, jeśli obie strony mają skutki uboczne. A jeśli masz tak wiele efektów ubocznych, prawdopodobnie robisz coś innego źle. Ogólnie rzecz biorąc, naprawdę powinieneś preferować AndAlso.
źródło
Oprócz powyższych odpowiedzi AndAlso zapewnia proces warunkowania zwany zwarciem. Wiele języków programowania ma tę funkcjonalność wbudowaną, podobnie jak vb.net, i może zapewnić znaczny wzrost wydajności w długich instrukcjach warunkowych, eliminując niepotrzebne oceny.
Innym podobnym warunkiem jest warunek OrElse, który sprawdzałby poprawny warunek tylko wtedy, gdy lewy warunek jest fałszywy, co eliminuje niepotrzebne sprawdzanie warunku po znalezieniu warunku prawdziwego.
Radziłbym, abyś zawsze stosował procesy zwarciowe i ustrukturyzował swoje instrukcje warunkowe w taki sposób, aby przynieść największe korzyści. Na przykład najpierw przetestuj swoje najbardziej wydajne i najszybsze warunki, aby biegać w długich warunkach tylko wtedy, gdy jest to absolutnie konieczne, a za drugim razem zwarcie.
źródło
Dla większości z nas OrElse i AndAlso wykonają tę sztuczkę, z wyjątkiem kilku mylących wyjątków (mniej niż 1%, w których możemy użyć Or i And).
Staraj się nie dać się ponieść emocjom ludzi popisujących się logiką logiczną i sprawiających, że wygląda jak rakieta.
Jest to dość proste i proste, a czasami twój system może nie działać zgodnie z oczekiwaniami, ponieważ nie podoba ci się twoja logika. A przecież twój mózg mówi ci, że jego logika jest w 100% przetestowana i sprawdzona i powinna działać. W tym momencie przestań ufać swojemu mózgowi i poproś go, aby pomyślał ponownie lub (nie OrElse, a może OrElse) zmusisz się do szukania innej pracy, która nie wymaga wiele logiki.
źródło
Aby zrozumieć słowami, a nie kodami:
Przypadek użycia:
Za pomocą „I” kompilator sprawdzi wszystkie warunki, więc jeśli sprawdzasz, czy obiekt może być „Nic”, a następnie sprawdzasz jedną z jego właściwości, wystąpi błąd wykonania.
Ale z AndAlso z pierwszym „fałszem” w warunkach będzie sprawdzał następny, więc nie wystąpi błąd.
źródło