Qual è la differenza tra And e AndAlso in VB.NET?


Risposte:


380

L' Andoperatore valuta entrambi i lati, dove AndAlsovaluta 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 AndAlsocome faresti &&.

Maggiori informazioni qui: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/


2
Il link "Ulteriori informazioni" è interrotto. Ecco il nuovo URL: panopticoncentral.net/2003/08/18/…
Rory O'Kane

12
Qualcuno sa perché non hanno scelto "AndThen" invece? Penso che questo sarebbe più intuitivo.
potente

7
Ho sempre pensato che fosse contro intuitivo. E vorrebbe dire anche che controllerà entrambi e questo dovrebbe essere il contrario! Quindi perché devo venire a SO per controllare cose del genere (sì, sono un ragazzo #). Inoltre, non dovresti mai fare una domanda come "differenza tra And e AndAlso". Troppi ands! Il mio insegnante di inglese mi avrebbe ucciso
Robin French,

3
Ogni volta che uso OrElse penso sempre a South Park "Oppure cosa?" "Esatto"
Robin French,

1
@tmighty indovina che causerebbe più confusione perché Thenè la sua parola chiave.
Helsinki,

29

L' Andoperatore 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 Andinvece di AndAlso, proverà comunque a farlo Object.Load()anche se lo fosse nothing, il che genererebbe un'eccezione.


14
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.
Joel Coehoorn,

1
Innanzitutto, Andalso non è principalmente utilizzato per "risparmiare sull'autonomia", è assurdo. In secondo luogo, fare in modo che il secondo argomento comporti un utile "effetto collaterale" è una brutta pratica da brutti cazzi.
Tor Haugen,

2
Tuttavia, non si può sostenere che non "risparmi in fase di esecuzione". E ho trovato situazioni in cui gli effetti collaterali sono in realtà, non cattive pratiche da brutti culi.
Ed Marty,

1
"Generalmente le persone usano il metodo del corto circuito se c'è una ragione per non controllare esplicitamente la seconda parte" Ehm, wut? Spero che le persone usino il corto circuito a meno che non abbiano una ragione per non farlo! Nessuno dovrebbe usare il vecchio and/ a ormeno 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 ...
underscore_d

20

È interessante notare che nessuna delle risposte ha detto che Ande Orin VB.NET sono operatori bit, mentre OrElsee AndAlsosono 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 0sarà impostato eper -1dimostrare Notè anche un operatore bit.

||e &&(le versioni C # di OrElsee AndAlso) restituiscono l'ultima espressione valutata che sarebbe 3e 5rispettivamente. Questo ti permette di usare il linguaggio v || 5in C # per dare 5come valore dell'espressione quando vè nullo ( 0e un numero intero) e il valore di valtrimenti. 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 Ore Andper operazioni a bit (intero o booleano). Utilizzare OrElsee AndAlsoper "cortocircuitare" un'operazione per risparmiare tempo o testare la validità di una valutazione prima di valutarla. If valid(evaluation) andalso evaluation thenoif not (unsafe(evaluation) orelse (not evaluation)) then

Bonus: qual è il valore di quanto segue?

Dim e = Not 0 And 3

Penso che tu sia confuso ||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)
Ben Voigt

14
If Bool1 And Bool2 Then

Valuta sia Bool1 che Bool2

If Bool1 AndAlso Bool2 Then

Valuta Bool2 se e solo se Bool1 è true.


13

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 Andassicura che una riga venga consumata ogni volta che viene verificata la condizione. Considerando che AndAlsopotrebbe leggere l'ultima riga di File1e lasciare File2senza 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.


5

Un modo semplice di pensarci è usare anche un inglese più semplice

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
L'inglese è più confuso del codice perché non ha una specifica!
binki,

5

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.


5

Vedi anche la domanda Stack Overflow: dovrei sempre usare gli operatori AndAlso e OrElse? .

Inoltre: un commento per coloro che hanno menzionato l'uso Andse 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.


3

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.


Vale anche la pena menzionare IIF (Immediate If) perché non cortocircuita e può creare condizioni abbastanza diverse dalle intenzioni del programmatore, poiché vengono valutati sia i componenti vero che falso. In precedenza, qualcuno ha affermato di utilizzare intenzionalmente questo comportamento con effetti collaterali, ma - non lo considero un metodo efficace, dal momento che l'Istmedia If non ha intenzione intenzionale di eseguire la valutazione in quel modo che posso rilevare.
jinzai,

"Oltre alle risposte di cui sopra, AndAlso fornisce un processo di condizionamento noto come corto circuito." Ogni risposta sopra questa si concentra sul corto circuito. : P Ma una buona descrizione e raccomandazioni.
underscore_d

1

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.


0

Per capire con parole non merluzzi:

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.