web-dev-qa-db-fra.com

Quelle est la différence entre And et AndAlso dans VB.NET?

Dans VB.NET, quelle est la différence entre And et AndAlso? Que devrais-je utiliser?

239
Nakul Chaudhary

L'opérateur And évalue les deux côtés, où AndAlso évalue le côté droit si et seulement si le côté gauche est vrai.

Un exemple:

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

Ce qui précède lève une exception si mystring = Nothing

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

Celui-ci ne lève pas d'exception.

Donc, si vous venez du monde C #, vous devriez utiliser AndAlso comme vous utiliseriez &&.

Plus d'infos ici: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/

367
Nico

L'opérateur And vérifie toutes les conditions de l'instruction avant de continuer, tandis que l'opérateur Andalso s'arrête s'il sait que la condition est fausse. Par exemple:

if x = 5 And y = 7

Vérifie si x est égal à 5 ​​et si y est égal à 7, puis continue si les deux sont vrais.

if x = 5 AndAlso y = 7

Vérifie si x est égal à 5. Si ce n'est pas le cas, il ne vérifie pas si y est égal à 7, car il sait que la condition est déjà fausse. (Ceci s'appelle court-circuiter.)

Généralement, les gens utilisent la méthode du court-circuit s’il existe une raison de ne pas vérifier explicitement la deuxième partie si la première est fausse, par exemple si elle lève une exception si elle est cochée. Par exemple:

If Not Object Is Nothing AndAlso Object.Load()

Si cela utilisait And au lieu de AndAlso, il essaierait toujours de Object.Load() même s'il s'agissait de nothing, ce qui déclencherait une exception.

29
Ed Marty

Il est intéressant qu'aucune des réponses ne mentionne que And et Or dans VB.NET sont des opérateurs de bits, alors que OrElse et AndAlso sont des opérateurs strictement booléens.

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

Note: un entier non nul est considéré true; Dim e = not 0 définira e sur -1 démontrant que Not est également un opérateur de bit.

|| et && (les versions C # de OrElse et AndAlso) renvoient la dernière expression évaluée qui serait 3 et 5. Cela vous permet d'utiliser l'idiome v || 5 en C # pour donner 5 comme valeur de l'expression lorsque v est null ou (0 et un entier) et la valeur de v sinon. La différence de sémantique peut empêcher un programmeur C # de jouer dans VB.NET, car cet "idiome de valeur par défaut" ne fonctionne pas dans VB.NET.

Donc, pour répondre à la question: Utilisez Or et And pour les opérations sur les bits (entier ou booléen). Utilisez OrElse et AndAlso pour "court-circuiter" une opération afin de gagner du temps ou pour tester la validité d'une évaluation avant de l'évaluer. If valid(evaluation) andalso evaluation then ou if not (unsafe(evaluation) orelse (not evaluation)) then

Bonus: Quelle est la valeur de ce qui suit?

Dim e = Not 0 And 3
18
Charles Jacks
If Bool1 And Bool2 Then

Évalue Bool1 et Bool2

If Bool1 AndAlso Bool2 Then

Evalue Bool2 si et seulement si Bool1 est vrai.

14
Bryan Anderson

Juste pour toutes les personnes qui disent que les effets secondaires sont diaboliques: un endroit où il est bon d’avoir deux effets secondaires dans une condition est de lire deux fichiers en même temps.

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

L'utilisation de And garantit qu'une ligne est consommée chaque fois que la condition est vérifiée. Alors que AndAlso peut lire la dernière ligne de File1 et laisser File2 sans ligne consommée.

Bien sûr, le code ci-dessus ne fonctionnerait pas, mais j'utilise des effets secondaires comme celui-ci tout le temps et je ne le considère pas comme "mauvais" ou "mal" vous mènerait à croire. C'est facile à lire et efficace.

13
Ian

AndAlso ressemble beaucoup à And, sauf que cela fonctionne comme && en C #, C++, etc.

La différence est que si la première clause (celle précédant AndAlso) est vraie, la seconde clause n'est jamais évaluée - l'expression logique composée est "court-circuitée".

Ceci est parfois très utile, par exemple. dans une expression telle que:

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

L'utilisation de l'ancien Et dans l'expression ci-dessus déclencherait une exception NullReferenceException si myObj était null.

5
Tor Haugen

Voir aussi la question du débordement de pile: Dois-je toujours utiliser les opérateurs AndAlso et OrElse?.

Aussi: Un commentaire pour ceux qui ont mentionné l'utilisation de And si le côté droit de l'expression a un effet secondaire dont vous avez besoin:

Si le côté droit a un effet secondaire dont vous avez besoin, déplacez-le simplement vers la gauche plutôt que d'utiliser "Et". Vous avez vraiment besoin que de "Et" si les deux côtés ont des effets secondaires. Et si vous avez autant d’effets secondaires, vous ferez probablement autre chose de mal. En général, vous devriez vraiment préférer AndAlso.

5
Joel Coehoorn

Une façon simple d'y penser est d'utiliser un anglais encore plus clair

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


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

En plus des réponses ci-dessus, AndAlso fournit également un processus de conditionnement appelé court-circuit. De nombreux langages de programmation intègrent cette fonctionnalité, à l'instar de vb.net, et peuvent augmenter considérablement les performances dans les instructions de condition longues en supprimant les évaluations inutiles.

Une autre condition similaire est la condition OrElse qui ne vérifie la condition correcte que si la condition de gauche est fausse, éliminant ainsi les vérifications de condition inutiles après la découverte d'une condition réelle.

Je vous conseillerais de toujours utiliser des processus de court-circuit et de structurer vos instructions conditionnelles de manière à en tirer le meilleur parti. Par exemple, testez d’abord les conditions les plus efficaces et les plus rapides afin de ne gérer vos conditions longues que lorsque vous devez absolument court-circuiter les autres fois.

3
davidallyoung

Pour la majorité d'entre nous, OrElse et AndAlso feront également l'affaire, à l'exception de quelques exceptions déroutantes (moins de 1% pour lesquelles nous aurons peut-être besoin d'utiliser Or et And).

Essayez de ne pas vous laisser emporter par des personnes affichant leurs logiques booléennes et faisant en sorte qu’elles ressemblent à une science de fusée.

C'est assez simple et direct et parfois votre système peut ne pas fonctionner comme prévu, car il n'aime pas votre logique en premier lieu. Et pourtant, votre cerveau vous répète que sa logique est testée et prouvée à 100% et que cela devrait fonctionner. À ce moment précis, arrêtez de faire confiance à votre cerveau et demandez-lui de réfléchir à nouveau ou (pas OrElse ou peut-être OrElse), vous vous forcez à chercher un autre travail ne nécessitant pas beaucoup de logique.

1
Anand