In VB.NET, qual è la differenza tra And
e AndAlso
? Quale dovrei usare?
In VB.NET, qual è la differenza tra And
e AndAlso
? Quale dovrei usare?
Risposte:
L' And
operatore valuta entrambi i lati, dove AndAlso
valuta il lato destro se e solo se il lato sinistro è vero.
Un esempio:
If mystring IsNot Nothing And mystring.Contains("Foo") Then
' bla bla
End If
Quanto sopra genera un'eccezione se mystring = Nothing
If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then
' bla bla
End If
Questo non fa eccezione.
Quindi, se vieni dal mondo C #, dovresti usare AndAlso
come faresti &&
.
Maggiori informazioni qui: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/
Then
è la sua parola chiave.
L' And
operatore verificherà tutte le condizioni nell'istruzione prima di continuare, mentre l'operatore Andalso si fermerà se sa che la condizione è falsa. Per esempio:
if x = 5 And y = 7
Verifica se x è uguale a 5 e se y è uguale a 7, quindi continua se entrambi sono veri.
if x = 5 AndAlso y = 7
Verifica se x è uguale a 5. In caso contrario, non verifica se y è 7, poiché sa che la condizione è già falsa. (Questo si chiama corto circuito.)
Generalmente le persone usano il metodo del corto circuito se c'è un motivo per non controllare esplicitamente la seconda parte se la prima parte non è vera, come se generasse un'eccezione se selezionata. Per esempio:
If Not Object Is Nothing AndAlso Object.Load()
Se usato And
invece di AndAlso
, proverà comunque a farlo Object.Load()
anche se lo fosse nothing
, il che genererebbe un'eccezione.
and
/ a or
meno che non abbiano una ragione - di cui penso che quelli legittimi siano pochi e lontani tra loro. Sicuramente c'è un motivo per cui la maggior parte delle altre lingue cortocircuita di default: mantiene il senso del risultato mentre non valuta espressioni potenzialmente costose quando non contribuiscono a nulla. Gli effetti collaterali nascosti in condizioni dovrebbero essere, beh, gli occhi laterali. Ma questa è solo la mia opinione ...
È interessante notare che nessuna delle risposte ha detto che And
e Or
in VB.NET sono operatori bit, mentre OrElse
e AndAlso
sono strettamente operatori booleani.
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
Nota : viene considerato un numero intero diverso da zero true
; Dim e = not 0
sarà impostato e
per -1
dimostrare Not
è anche un operatore bit.
||
e &&
(le versioni C # di OrElse
e AndAlso
) restituiscono l'ultima espressione valutata che sarebbe 3
e 5
rispettivamente. Questo ti permette di usare il linguaggio v || 5
in C # per dare 5
come valore dell'espressione quando v
è null
o ( 0
e un numero intero) e il valore di v
altrimenti. La differenza nella semantica può cogliere alla sprovvista un programmatore C # in VB.NET poiché questo "linguaggio del valore predefinito" non funziona in VB.NET.
Quindi, per rispondere alla domanda : utilizzare Or
e And
per operazioni a bit (intero o booleano). Utilizzare OrElse
e AndAlso
per "cortocircuitare" un'operazione per risparmiare tempo o testare la validità di una valutazione prima di valutarla. If valid(evaluation) andalso evaluation then
oif not (unsafe(evaluation) orelse (not evaluation)) then
Bonus: qual è il valore di quanto segue?
Dim e = Not 0 And 3
||
e &&
con ??
. Mentre ci sono lingue in cui ||
verrà restituito il valore non falso, C # non è uno di questi e restituisce un bool
(tranne per gli operatori nullable sollevati, in cui si ottiene un Nullable<bool>
risultato)
If Bool1 And Bool2 Then
Valuta sia Bool1 che Bool2
If Bool1 AndAlso Bool2 Then
Valuta Bool2 se e solo se Bool1 è true.
Solo per tutte quelle persone che affermano che gli effetti collaterali sono cattivi: un posto in cui avere due effetti collaterali in una condizione è buono sarebbe leggere due oggetti file in tandem.
While File1.Seek_Next_Row() And File2.Seek_Next_Row()
Str1 = File1.GetRow()
Str2 = File2.GetRow()
End While
L'uso di And
assicura che una riga venga consumata ogni volta che viene verificata la condizione. Considerando che AndAlso
potrebbe leggere l'ultima riga di File1
e lasciare File2
senza una riga consumata.
Ovviamente il codice sopra non funzionerebbe, ma io uso sempre effetti collaterali come questo e non lo considero un codice " cattivo " o " cattivo " come alcuni potrebbero indurti a credere. È facile da leggere ed efficiente.
AndAlso è molto simile a And, tranne per il fatto che funziona come && in C #, C ++, ecc.
La differenza è che se la prima clausola (quella precedente ad AndAlso) è vera, la seconda clausola non viene mai valutata - l'espressione logica composta è "in cortocircuito".
Questo a volte è molto utile, ad esempio in un'espressione come:
If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then
...
End If
L'uso del vecchio And nell'espressione precedente genererebbe una NullReferenceException se myObj fosse null.
Vedi anche la domanda Stack Overflow: dovrei sempre usare gli operatori AndAlso e OrElse? .
Inoltre: un commento per coloro che hanno menzionato l'uso And
se il lato destro dell'espressione ha un effetto collaterale necessario:
Se il lato destro ha un effetto collaterale di cui hai bisogno, spostalo sul lato sinistro invece di usare "E". Hai davvero bisogno di "E" solo se entrambe le parti hanno effetti collaterali. E se hai molti effetti collaterali, probabilmente stai facendo qualcos'altro. In generale, dovresti davvero preferire AndAlso.
Oltre alle risposte di cui sopra, AndAlso fornisce un processo di condizionamento noto come corto circuito. Molti linguaggi di programmazione hanno questa funzionalità integrata come fa vb.net e possono fornire sostanziali aumenti delle prestazioni nelle dichiarazioni a lungo termine tagliando valutazioni inutili.
Un'altra condizione simile è la condizione OrElse che verificherebbe la condizione giusta solo se la condizione sinistra è falsa, eliminando così i controlli delle condizioni non necessari dopo aver trovato una condizione vera.
Ti consiglierei di utilizzare sempre i processi di corto circuito e strutturare le tue dichiarazioni condizionali in modo che possano trarne il massimo beneficio. Ad esempio, prova prima le condizioni più efficienti e veloci in modo da eseguire le tue condizioni lunghe solo quando devi assolutamente e cortocircuitare le altre volte.
Per la maggior parte di noi OrElse e AndAlso faranno il trucco ad eccezione di alcune eccezioni confuse (meno dell'1% in cui potremmo dover usare Or e And).
Cerca di non lasciarti trasportare dalle persone che mostrano le loro logiche booleane e fanno sembrare una scienza missilistica.
È abbastanza semplice e diretto e occasionalmente il tuo sistema potrebbe non funzionare come previsto perché in primo luogo non gradisce la tua logica. Eppure il tuo cervello continua a dirti che la sua logica è testata e provata al 100% e dovrebbe funzionare. In quel preciso momento smetti di fidarti del tuo cervello e chiedigli di ripensarci o (non OrElse o forse OrElse) ti costringi a cercare un altro lavoro che non richiede molta logica.
Caso d'uso:
con "And" il compilatore controllerà tutte le condizioni, quindi se stai verificando che un oggetto possa essere "Nothing" e quindi stai controllando una delle sue proprietà, avrai un errore di runtime.
Ma con AndAlso con il primo "falso" nelle condizioni controllerà il prossimo in modo da non avere un errore.