En VB.NET, quelle est la différence entre And
y AndAlso
? Lequel dois-je utiliser ?
Le lien "Plus d'infos" est cassé. Voici la nouvelle URL : panopticoncentral.net/2003/08/18/
En VB.NET, quelle est la différence entre And
y AndAlso
? Lequel dois-je utiliser ?
Le site 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
L'opération ci-dessus déclenche 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 le feriez avec &&
.
Plus d'informations ici : http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/
Éditez simplement la réponse Rory... pas besoin de laisser des liens cassés pour que les gens trébuchent dessus :)
@Michael Je craignais que la modification suggérée soit rejetée comme "non substantielle" - quelques rejets passés m'ont rendu méfiant. Mais votre montage est passé donc je suppose qu'il s'agit d'une simple correction de lien. est sûr.
Le site And
vérifiera toutes les conditions de l'instruction avant de poursuivre, tandis que l'opérateur Andalso s'arrêtera 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. S'il ne l'est pas, il ne vérifie pas si y est égal à 7, car il sait déjà que la condition est fausse. (Cela s'appelle le court-circuitage).
En général, les gens utilisent la méthode de court-circuitage s'il y a une raison de ne pas vérifier explicitement la deuxième partie si la première partie n'est pas vraie, par exemple si elle lève une exception si elle est vérifiée. Par exemple :
If Not Object Is Nothing AndAlso Object.Load()
Si cela a été utilisé And
au lieu de AndAlso
il essaiera toujours de Object.Load()
même si c'était nothing
ce qui entraînerait une exception.
Si le côté droit a un effet secondaire dont vous avez besoin, il suffit de le déplacer vers le côté gauche plutôt que d'utiliser "Et". Vous n'avez vraiment besoin de "Et" que si les deux Les côtés ont des effets secondaires. Et si vous avez autant d'effets secondaires, c'est que vous faites probablement quelque chose de mal.
Premièrement, Andalso n'est pas utilisé principalement pour "économiser sur le temps d'exécution", c'est absurde. Deuxièmement, faire en sorte que le second argument ait un "effet secondaire" utile est une mauvaise pratique.
Vous ne pouvez pas dire qu'il n'y a pas d'économies sur le temps d'exécution. Et j'ai trouvé des situations où les effets secondaires ne sont pas, en fait, une mauvaise pratique.
À l'intention de tous ceux qui disent que les effets secondaires sont mauvais : un endroit où il est bon d'avoir deux effets secondaires dans une même condition serait la lecture de deux objets de fichier en tandem.
While File1.Seek_Next_Row() And File2.Seek_Next_Row()
Str1 = File1.GetRow()
Str2 = File2.GetRow()
End While
Utilisation de la And
garantit qu'une ligne est consommée chaque fois que la condition est vérifiée. Alors que AndAlso
pourrait lire la dernière ligne de File1
et laisser File2
sans une ligne consommée.
Bien sûr, le code ci-dessus ne fonctionnerait pas, mais j'utilise des effets secondaires de ce type tout le temps et je ne le considérerais pas " mauvais " ou " maléfique "comme certains voudraient vous le faire croire. Il est facile à lire et efficace.
AndAlso ressemble beaucoup à And, sauf qu'il fonctionne comme && en C#, C++, etc.
La différence est que si la première clause (celle qui précède AndAlso) est vraie, la deuxième 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 And dans l'expression ci-dessus entraînerait une NullReferenceException si myObj était nul.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.