¿Cuál es la diferencia entre or y OrElse ?
if temp is dbnull.value or temp = 0
produce el error:
El operador '=' no está definido para el tipo 'DBNull' y el tipo 'Integer'.
mientras este funciona como un encanto?
if temp is dbnull.value OrElse temp = 0
Este es el mismo comportamiento que con C #, donde todos usan el Or codicional (||) y el Y condicional (&&), donde también tiene el O normal (|) y el Y normal (&). Entonces, comparar C # con VB.Net es:
| => O
|| => O bien
& => Y
&& => YTambién
Los operadores booleanos condifitonales son muy útiles para evitar construcciones if anidadas. Pero a veces se necesitan los operadores booleanos normales para garantizar el acceso a ambas rutas de código.
fuente
|
y&
son operadores bit a bit en C #, no operaciones booleanas en absoluto.O Else está cortocircuitado , esto significa que solo se probará un lado de la expresión si el primer lado coincide.
Al igual que AndAlso, solo probará un lado de la expresión si la primera mitad falla.
fuente
(Miré otras respuestas y me di cuenta de que estaba terriblemente equivocado)
El operador OrElse "realiza una disyunción lógica de cortocircuito en dos expresiones", es decir: si el operando izquierdo es verdadero y así se garantiza que toda la expresión es verdadera, el operando derecho ni siquiera será evaluado (esto es útil en casos como:
para evitar una NullReferenceException lanzada por el operando de la derecha.
Estoy sinceramente sorprendido de que esta ( evaluación perezosa ) no sea el comportamiento predeterminado de
or
yand
como lo es en C / C ++ y C # (y muchos otros lenguajes ...)fuente
O bien, evalúa la primera expresión y luego, si es verdadera, procederá a la declaración, mientras que OR evalúa dos expresiones antes de continuar con su declaración.
Ejemplo:
Usando OrElse
El resultado es: VERDADERO
Usando OR
El resultado es: El error no puede convertir la cadena en doble.
fuente
La respuesta de Bert no es muy precisa. El '|' o '&' es un operador lógico, en C #, siempre se trata como un operador de bits, consulte el siguiente código como ejemplo
Lo siguiente es IL
cuando usas || para probar "a == null" y "a.ToString () ==" sdffd ", el IL será
Ahora puede ver la diferencia, no piense en '|' o 'y' como operador condicional, es solo un operador lógico, no creo que sea necesario usarlo para juzgar la condición
fuente
The '|' or '&' is logical operator, in C #, it always treat as bit operator
. Yo también creía en esto, hasta que vi esta referencia, msdn.microsoft.com/en-us/library/kxszd0kx.aspxA menos que la lógica de su código requiera el comportamiento de cortocircuito que proporciona OrElse, me inclinaría por usar el operador Or porque:
fuente
La razón por la que falla la compilación en el ejemplo es el orden de las operaciones.
El analizador de expresiones está intentando evaluar primero "dbnull.value o temp".
El error está aquí, porque no puede hacer un OR bit a bit entre un entero (temp) y dbnull.value.
OrElse corrige esto, no porque esté cortocircuitado, sino porque es más bajo en el orden de las operaciones , por lo que "temp is dbnull.value" y "3 = 0" se evalúan primero, en lugar de que el analizador intente comparar dbNull y temperatura
Entonces, la evaluación con OrElse funciona como espera: (suponga temp = 3)
Esto fue en realidad en un examen de ingreso en una empresa de software para la que solía trabajar, y era un problema común que solía encontrar en VB6. Por lo tanto, es una buena idea poner entre paréntesis las subexpresiones cuando se usan operadores booleanos:
Esto se habría compilado correctamente:
Aunque, como ya han señalado todos, OrElse y AndAlso son realmente los operadores correctos para usar en este contexto.
fuente