En VB.NET, ¿cuál es la diferencia entre And
y AndAlso
? ¿Cuál debería usar?
vb.net
short-circuiting
Nakul Chaudhary
fuente
fuente
Then
es su propia palabra clave.El
And
operador verificará todas las condiciones en la declaración antes de continuar, mientras que el operador Andalso se detendrá si sabe que la condición es falsa. Por ejemplo:Comprueba si x es igual a 5, y si y es igual a 7, luego continúa si ambas son verdaderas.
Comprueba si x es igual a 5. Si no lo es, no comprueba si y es 7, porque sabe que la condición ya es falsa. (Esto se llama cortocircuito).
En general, las personas usan el método de cortocircuito si hay una razón para no verificar explícitamente la segunda parte si la primera parte no es verdadera, como si arrojaría una excepción si se verifica. Por ejemplo:
Si eso se usara en
And
lugar deAndAlso
, aún lo intentaríaObject.Load()
incluso si fuera asínothing
, lo que arrojaría una excepción.fuente
and
/ aor
menos que tenga una razón, de la cual creo que los legítimos son pocos y distantes. Seguramente hay una razón por la cual la mayoría de los otros idiomas tienen un corto circuito por defecto: retiene el sentido del resultado sin evaluar las expresiones potencialmente costosas cuando no aportan nada. Los efectos colaterales escondidos en las condiciones deben ser, bueno, de ojos secundarios. Pero esa es solo mi opinión ...Curiosamente ninguna de las respuestas mencionó que
And
yOr
en VB.NET son los operadores de bits, mientras queOrElse
yAndAlso
son estrictamente operadores booleanos.Nota : se considera un número entero distinto de cero
true
;Dim e = not 0
estableceráe
para-1
demostrarNot
también es un operador de bits.||
y&&
(las versiones de C # deOrElse
yAndAlso
) devuelven la última expresión evaluada que sería3
y5
respectivamente. Esto le permite usar el idiomav || 5
en C # para dar5
como valor de la expresión cuandov
isnull
o (0
y un número entero) y el valor de lov
contrario. La diferencia en la semántica puede pillar a un programador de C # incursionando en VB.NET desprevenido ya que este "idioma de valor predeterminado" no funciona en VB.NET.Entonces, para responder la pregunta : Use
Or
yAnd
para operaciones de bit (entero o booleano). UseOrElse
yAndAlso
para "cortocircuitar" una operación para ahorrar tiempo, o pruebe la validez de una evaluación antes de evaluarla.If valid(evaluation) andalso evaluation then
oif not (unsafe(evaluation) orelse (not evaluation)) then
Bonificación: ¿Cuál es el valor de lo siguiente?
fuente
||
y&&
con??
. Si bien hay idiomas donde||
devolverá el valor no falsey, C # no es uno de ellos, y devuelve unbool
(a excepción de los operadores anulables levantados, donde obtienes unNullable<bool>
resultado)Evalúa tanto Bool1 como Bool2
Evalúa Bool2 si y solo si Bool1 es verdadero.
fuente
Solo para todas aquellas personas que dicen que los efectos secundarios son malos: un lugar donde tener dos efectos secundarios en una condición es bueno sería leer dos objetos de archivo en conjunto.
El uso de
And
asegura que se consume una fila cada vez que se verifica la condición. Mientras queAndAlso
podría leer la última línea deFile1
y dejarFile2
sin una línea consumida.Por supuesto, el código anterior no funcionaría, pero uso efectos secundarios como este todo el tiempo y no lo consideraría un código " malo " o " malo ", ya que algunos te harían creer. Es fácil de leer y eficiente.
fuente
Una manera simple de pensarlo es usar un inglés incluso más claro
fuente
AndAlso es muy parecido a And, excepto que funciona como && en C #, C ++, etc.
La diferencia es que si la primera cláusula (la anterior a AndAlso) es verdadera, la segunda cláusula nunca se evalúa: la expresión lógica compuesta es "cortocircuito".
Esto a veces es muy útil, por ejemplo, en una expresión como:
Usar el antiguo Y en la expresión anterior arrojaría una NullReferenceException si myObj fuera nulo.
fuente
Consulte también la pregunta sobre desbordamiento de pila: ¿Debería usar siempre los operadores AndAlso y OrElse? .
Además: un comentario para aquellos que mencionaron usar
And
si el lado derecho de la expresión tiene un efecto secundario que necesita:Si el lado derecho tiene un efecto secundario que necesita, simplemente muévalo hacia el lado izquierdo en lugar de usar "Y". Realmente solo necesita "Y" si ambos lados tienen efectos secundarios. Y si tiene tantos efectos secundarios, probablemente esté haciendo algo mal. En general, realmente debería preferir AndAlso.
fuente
Además de las respuestas anteriores, AndAlso también proporciona un proceso de acondicionamiento conocido como cortocircuito. Muchos lenguajes de programación tienen esta funcionalidad incorporada como lo hace vb.net, y pueden proporcionar aumentos sustanciales de rendimiento en declaraciones de larga duración al eliminar evaluaciones que no son necesarias.
Otra condición similar es la condición OrElse que solo verificaría la condición correcta si la condición izquierda es falsa, eliminando así las verificaciones de condición innecesarias después de encontrar una condición verdadera.
Le aconsejaría que utilice siempre procesos de cortocircuito y estructurar sus declaraciones condicionales de manera que esto pueda beneficiarse al máximo. Por ejemplo, pruebe primero sus condiciones más eficientes y rápidas para que solo ejecute sus condiciones largas cuando sea absolutamente necesario y cortocircuite las otras veces.
fuente
Para la mayoría de nosotros, OrElse y AndAlso harán el truco, salvo algunas excepciones confusas (menos del 1% en las que tendremos que usar Or y And).
Trate de no dejarse llevar por personas que muestran sus lógicas booleanas y hacen que parezca una ciencia espacial.
Es bastante simple y directo, y ocasionalmente su sistema puede no funcionar como se esperaba porque, en primer lugar, no le gusta su lógica. Y, sin embargo, su cerebro sigue diciéndole que su lógica está 100% probada y comprobada y que debería funcionar. En ese mismo momento, deja de confiar en tu cerebro y pídele que piense de nuevo o (no OrElse o tal vez OrElse) te obligas a buscar otro trabajo que no requiera mucha lógica.
fuente
Para entender con palabras no bacalaos:
Caso de uso:
con “Y” el compilador verificará todas las condiciones, por lo que si está verificando que un objeto podría ser “Nada” y luego está verificando una de sus propiedades, tendrá un error de tiempo de ejecución.
Pero con AndAlso con el primer "falso" en las condiciones, verificará el siguiente para que no tenga un error.
fuente