268 votes

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

En VB.NET, quelle est la différence entre And y AndAlso ? Lequel dois-je utiliser ?

410voto

Nico Points 5756

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/

2 votes

Le lien "Plus d'infos" est cassé. Voici la nouvelle URL : panopticoncentral.net/2003/08/18/

0 votes

Éditez simplement la réponse Rory... pas besoin de laisser des liens cassés pour que les gens trébuchent dessus :)

0 votes

@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.

35voto

Ed Marty Points 24861

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.

15 votes

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.

1 votes

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.

2 votes

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.

14voto

Bryan Anderson Points 9044
If Bool1 And Bool2 Then

Evalue à la fois Bool1 et Bool2

If Bool1 AndAlso Bool2 Then

Evalue Bool2 si et seulement si Bool1 est vrai.

13voto

Ian Points 628

À 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.

6voto

Tor Haugen Points 8258

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.

0 votes

Je pense que vous voulez dire si la première clause est fausse, la deuxième clause ne sera pas évaluée. ? Dans l'exemple ci-dessus Not IsNull(myObj) est FAUX, alors il ne doit pas évaluer la deuxième clause. Sinon, elle lancera une NullReferenceException.

Prograide.com

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.

Powered by:

X