98 votes

Or contre OrElse

Quelle est la différence entre o y OuElse ?

if temp is dbnull.value or temp = 0

produit l'erreur :

L'opérateur '=' n'est pas défini pour le type 'DBNull' et le type 'Integer'.

alors que celui-ci fonctionne comme un charme ! ?

if temp is dbnull.value OrElse temp = 0

151voto

AakashM Points 32891

OrElse est un court-circuitage opérateur, Or ne l'est pas.

D'après la définition de l'opérateur booléen "ou", si le premier terme est vrai, alors l'ensemble est certainement vrai - nous n'avons donc pas besoin d'évaluer le deuxième terme.

OrElse sait cela, et n'essaie donc pas d'évaluer temp = 0 une fois qu'il est établi que temp Is DBNull.Value

Or ne le sait pas, et tentera toujours d'évaluer les deux termes. Lorsque temp Is DBNull.Value il ne peut pas être comparé à zéro, donc il s'écroule.

Vous devriez utiliser... eh bien, celui qui a du sens.

2 votes

Donc Or n'a de sens que lorsque j'appelle une fonction après le ou qui a des effets secondaires dont mon code dépend ?

4 votes

Ou a du sens dans tous les cas où le deuxième élément ne déclenche pas d'erreur si le premier est vrai...

4 votes

@ malach : Je suppose que oui (vous avez vraiment le comportement OrElse par défaut dans la plupart des autres langages) : Ce n'est pas une bonne idée d'appeler des fonctions avec des effets secondaires dans les conditionnels composés, cela rend le code illisible.

45voto

Bert Heesbeen Points 151

C'est le même comportement qu'en C#, où tout le monde utilise le Ou (||) et le Et (&&) conditionnels, alors que vous avez également le Ou (|) et le Et (&) normaux. La comparaison entre C# et VB.Net est donc la suivante :

| => Ou

|| => OrElse

& => Et

&& => AndAlso

Les opérateurs booléens condifitonaux sont très utiles pour éviter les constructions if imbriquées. Mais parfois, les opérateurs booléens normaux sont nécessaires pour garantir l'atteinte des deux chemins de code.

10 votes

Je ne savais pas vraiment que c'était disponible. Merci pour cette nouvelle information. C'est bon à savoir, même si je ne vois pas vraiment de situation dans laquelle je voudrais utiliser "|". Je pense qu'il faudrait que la deuxième condition provoque des effets secondaires pour que cela ait un sens, et cela en soi n'a guère de sens à mon avis ! ;)

8 votes

Eh, pour autant que je sache, | y & sont des opérateurs binaires en C#, pas du tout des opérations booléennes.

8voto

Stevo3000 Points 12725

OrElse est court-circuité cela signifie que seul un côté de l'expression sera testé si le premier côté est une correspondance.

Tout comme AndAlso qui ne testera qu'un côté de l'expression si la première moitié est un échec.

4voto

Utaal Points 2063

(J'ai regardé d'autres réponses et j'ai réalisé que j'avais terriblement tort)

L'opérateur OrElse "effectue une disjonction logique de court-circuitage sur deux expressions", c'est-à-dire que si l'opérande de gauche est vrai et que l'expression entière est donc garantie vraie, l'opérande de droite ne sera même pas évalué (ceci est utile dans des cas comme :

string a;
//...
if (a is null) or (a = "Hi") //...

pour éviter une NullReferenceException lancée par l'opérande de droite.

Je suis sincèrement étonné que ce ( évaluation paresseuse ) n'est pas le comportement par défaut de or y and comme c'est le cas en C/C++ et C# (et bien d'autres langages...)

7 votes

Le truc, c'est que dans VB classic, il y avait juste Et et Or, qui n'étaient pas en court-circuit. I pensez à J'ai raison de dire que les premières versions bêta de VB.NET ont en fait changé le comportement de ces opérateurs - il y a eu un tollé, alors ils ont été modifiés en arrière et AndAlso et OrElse (court-circuitage) ont été introduits. Je ne peux qu'imaginer les noms alternatifs qu'ils ont dû envisager si ceux-ci étaient les meilleurs...

1 votes

En fournissant Or et OrElse (| et || en C#), cela permet au développeur de choisir comment il traite son propre code. En utilisant le code ci-dessus, je devrais utiliser un try catch autour de lui pour gérer une valeur nulle dans la variable a. OrElse permet au développeur de gérer cela dans le else de l'instruction if comme un résultat possible connu plutôt que comme une exception. Cela est plus évident si la variable a est un paramètre d'une méthode, où vous avez moins de contrôle sur le moment où la variable reçoit une valeur (c'est-à-dire en dehors de la méthode).

0 votes

Le court-circuitage n'est pas non plus le comportement par défaut de OR et AND en C#. C# dispose de deux opérateurs différents pour les opérations de type bitwise et logique/court-circuitage. && et || effectuent des opérations de court-circuitage. logique et renvoient une valeur booléenne Les opérateurs & et | sont par bit et renvoie une valeur entière. Ainsi, lorsque 1 || 2 renvoie "vrai", 1 | 2 renvoie "3".

4voto

Larz Points 986

OrElse évalue la première expression puis, si elle est vraie, passe à la déclaration, tandis que OR évalue deux expressions avant de passer à leur déclaration.

Exemple :

Textbox1.Text= 4

Textbox2.Text= ""

Utilisation de OrElse

  If TextBox1.Text > 2 OrElse TextBox2.Text > 3 Then
      MsgBox("True")
  End If

Le résultat est : VRAI


Utilisation de l'OR

 If TextBox1.Text > 2 Or TextBox2.Text > 3 Then

            MsgBox("True")
  End If

Le résultat est : Erreur ne peut pas convertir une chaîne en double.

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