Dans VB.NET, quelle est la différence entre And
et AndAlso
? Que devrais-je utiliser?
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/
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.
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
If Bool1 And Bool2 Then
Évalue Bool1 et Bool2
If Bool1 AndAlso Bool2 Then
Evalue Bool2 si et seulement si Bool1 est vrai.
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.
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.
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.
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
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.
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.