Quelle est la différence entre or et OrElse ?
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
C'est le même comportement qu'avec C #, où tout le monde utilise le Coditional Or (||) et le Conditional And (&&), où vous avez également le Or normal (|) et le And normal (&). Donc, comparer C # à VB.Net est:
| => Ou
|| => OuElse
& => Et
&& => EtAussi
Les opérateurs booléens conditionnels sont très utiles pour empêcher les constructions if imbriquées. Mais parfois, les opérateurs booléens normaux sont nécessaires pour s'assurer d'atteindre les deux chemins de code.
la source
|
et ce&
sont des opérateurs binaires en C #, pas du tout des opérations booléennes.OrElse est court-circuité , cela signifie qu'un seul côté de l'expression sera testé si le premier côté correspond.
Tout comme AndAlso ne testera qu'un côté de l'expression si la première moitié est un échec.
la source
(J'ai regardé d'autres réponses et réalisé que j'avais terriblement tort)
L'opérateur OrElse "effectue une disjonction logique de court-circuit sur deux expressions", c'est-à-dire: si l'opérande gauche est vrai et que l'expression entière est donc garantie vraie, l'opérande droit ne sera même pas évalué (cela est utile dans des cas comme:
pour éviter une NullReferenceException lancée par l'opérande de droite.
Je suis sincèrement étonné que cette ( évaluation paresseuse ) ne soit pas le comportement par défaut de
or
etand
comme c'est le cas en C / C ++ et C # (et dans de nombreux autres langages ...)la source
OuElse évalue la première expression, puis si c'est vrai, il passera à l'instruction tandis que OU évalue deux expressions avant de passer à leur instruction.
Exemple:
Utiliser OrElse
Le résultat est: TRUE
Utiliser OR
Le résultat est: L' erreur ne peut pas convertir la chaîne en double.
la source
La réponse de Bert n'est pas très précise. Le '|' ou '&' est un opérateur logique, en C #, il est toujours traité comme un opérateur de bit, veuillez consulter le code suivant comme exemple
Ce qui suit est IL
lorsque vous utilisez || pour tester "a == null" et "a.ToString () ==" sdffd ", l'IL sera
Maintenant, vous pouvez voir la différence, ne pensez pas que le «|» ou 'et' comme opérateur conditionnel, c'est juste un opérateur logique, je ne pense pas qu'il soit nécessaire de l'utiliser pour juger la condition
la source
The '|' or '&' is logical operator, in C #, it always treat as bit operator
. J'y croyais aussi, jusqu'à ce que j'aie vu cette référence, msdn.microsoft.com/en-us/library/kxszd0kx.aspxÀ moins que votre logique de code ne nécessite le comportement de court-circuit fourni par OrElse, je pencherais vers l'utilisation de l'opérateur Or car:
la source
La raison pour laquelle la compilation échoue dans l'exemple est l'ordre des opérations.
L'analyseur d'expression essaie d'abord d'évaluer "dbnull.value ou temp".
L'erreur est là, car vous ne pouvez pas faire un OU au niveau du bit entre un entier (temp) et dbnull.value.
OrElse corrige ce problème, non pas parce qu'il est court-circuité, mais parce qu'il est plus bas dans l'ordre des opérations , et donc "temp is dbnull.value" et "3 = 0" sont évalués en premier, plutôt que l'analyseur essayant de comparer dbNull et temp.
Ainsi, l'évaluation avec OrElse fonctionne comme prévu: (supposons que temp = 3)
C'était en fait lors d'un examen d'entrée dans une société de logiciels pour laquelle je travaillais, et c'était un problème courant que j'avais l'habitude de rencontrer dans VB6. C'est donc une bonne idée de mettre entre parenthèses vos sous-expressions lorsque vous utilisez des opérateurs booléens:
Cela aurait compilé correctement:
Bien que, comme tout le monde l'a déjà souligné, OrElse et AndAlso sont vraiment les bons opérateurs à utiliser dans ce contexte.
la source