vb.net short-circuiting

¿Cuál es la diferencia entre And y AndAlso en VB.NET?



short-circuiting (10)

En VB.NET, ¿cuál es la diferencia entre And y AndAlso ? ¿Qué debo usar?


Además de las respuestas anteriores, también proporciona un proceso de acondicionamiento conocido como cortocircuito. Muchos lenguajes de programación tienen esta funcionalidad incorporada como vb.net, y pueden proporcionar aumentos sustanciales de rendimiento en declaraciones de condición prolongada al eliminar evaluaciones que son innecesarias.

Otra condición similar es la condición OrElse, que solo verificará la condición correcta si la condición izquierda es falsa, por lo que se eliminan las comprobaciones innecesarias después de que se encuentra una condición verdadera.

Le recomendaría que siempre use procesos de cortocircuito y estructure sus declaraciones condicionales de la manera que más pueda beneficiarse de esto. Por ejemplo, pruebe sus condiciones más eficientes y rápidas primero, de modo que solo ejecute sus condiciones largas cuando sea absolutamente necesario y realice un cortocircuito las otras veces.


Consulte también la pregunta sobre el desbordamiento de pila: ¿Debo usar siempre los operadores AndAlso y OrElse? .

También: un comentario para aquellos que mencionaron el uso de And si el lado derecho de la expresión tiene un efecto secundario, usted necesita:

Si el lado derecho tiene un efecto secundario que necesita, simplemente muévalo hacia el lado izquierdo en lugar de usar "Y". Solo necesitas "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.


Curiosamente, ninguna de las respuestas mencionó que And y Or en VB.NET son operadores de bits, mientras que OrElse y AndAlso son operadores estrictamente booleanos.

Dim a = 3 OR 5 '' Will set a to the value 7, 011 or 101 = 111 Dim a = 3 And 5 '' Will set a to the value 1, 011 and 101 = 001 Dim b = 3 OrElse 5 '' Will set b to the value true and not evaluate the 5 Dim b = 3 AndAlso 5 '' Will set b to the value true after evaluating the 5 Dim c = 0 AndAlso 5 '' Will set c to the value false and not evaluate the 5

Nota : un entero que no sea cero se considera true ; Dim e = not 0 establecerá e en -1 demuestra que Not es también un operador de bits.

|| y && (las versiones C # de OrElse y AndAlso ) devuelven la última expresión evaluada que sería 3 y 5 respectivamente. Esto te permite usar el idioma v || 5 v || 5 en C # para dar 5 como el valor de la expresión cuando v es null o ( 0 y un número entero) y el valor de v caso contrario. La diferencia en la semántica puede atrapar a un programador de C # incursión en VB.NET desprevenido, ya que este "idioma de valor predeterminado" no funciona en VB.NET.

Entonces, para responder a la pregunta : Utilice Or y And para operaciones de bits (entero o booleano). Utilice OrElse y AndAlso para "cortocircuitar" una operación para ahorrar tiempo, o probar la validez de una evaluación antes de evaluarla. If valid(evaluation) andalso evaluation then o if not (unsafe(evaluation) orelse (not evaluation)) then

Bonus: ¿Cuál es el valor de lo siguiente?

Dim e = Not 0 And 3


El operador And evalúa ambos lados, donde AndAlso evalúa el lado derecho si y solo si el lado izquierdo es verdadero.

Un ejemplo:

If mystring IsNot Nothing And mystring.Contains("Foo") Then '' bla bla End If

Lo anterior lanza una excepción si mystring = Nothing

If mystring IsNot Nothing AndAlso mystring.Contains("Foo") Then '' bla bla End If

Este no lanza una excepción.

Entonces, si vienes del mundo C #, deberías usar AndAlso como AndAlso && .

Más información aquí: http://www.panopticoncentral.net/2003/08/18/the-ballad-of-andalso-and-orelse/


El operador And 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:

if x = 5 And y = 7

Comprueba si x es igual a 5 y si y es igual a 7, luego continúa si ambos son verdaderos.

if x = 5 AndAlso y = 7

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 arrojara una excepción si se verifica. Por ejemplo:

If Not Object Is Nothing AndAlso Object.Load()

Si se usara And lugar de AndAlso , aún intentaría Object.Load() incluso si no fuera nothing , lo que arrojaría una excepción.


Para la mayoría de nosotros, OrElse y And también harán el truco a excepción de 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 que parecen una ciencia de cohetes.

Es bastante simple y directo y, en ocasiones, es posible que su sistema no funcione 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 probada y que debería funcionar. En ese preciso momento, deje de confiar en su cerebro y pídale que piense de nuevo o (no OrElse o tal vez OrElse) se obligue a buscar otro trabajo que no requiera mucha lógica.


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 tándem.

While File1.Seek_Next_Row() And File2.Seek_Next_Row() Str1 = File1.GetRow() Str2 = File2.GetRow() End While

El uso de And garantiza que se consuma una fila cada vez que se comprueba la condición. Mientras que AndAlso puede leer la última línea de File1 y dejar File2 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 código " malo " o " malo " como algunos lo harían creer. Es fácil de leer y eficiente.


Una manera simple de pensar en ello es usar un inglés más simple.

If Bool1 And Bool2 Then If [both are true] Then If Bool1 AndAlso Bool2 Then If [first is true then evaluate the second] Then


Y también es muy parecido a Y, excepto que funciona como && en C #, C ++, etc.

La diferencia es que si la primera cláusula (la anterior a And también) es verdadera, la segunda cláusula nunca se evalúa, la expresión lógica compuesta está "cortocircuitada".

Esto es a veces muy útil, por ejemplo, en una expresión como:

If Not IsNull(myObj) AndAlso myObj.SomeProperty = 3 Then ... End If

Usar el antiguo Y en la expresión anterior arrojaría una NullReferenceException si myObj fuera nulo.


If Bool1 And Bool2 Then

Evalúa tanto Bool1 como Bool2

If Bool1 AndAlso Bool2 Then

Evalúa Bool2 si y solo si Bool1 es verdadero.