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

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

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 arroja una excepción si mystring = Nothing

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

Este no arroja una excepción.

Entonces, si vienes del mundo C #, deberías usar AndAlso like you use && .

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 instrucción antes de continuar, mientras que el operador de 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, entonces continúa si ambos son verdaderos.

 if x = 5 AndAlso y = 7 

Comprueba si x es igual a 5. Si no es así, no verifica 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 no es verdadera, como por ejemplo si arroja una excepción si está marcada. Por ejemplo:

 If Not Object Is Nothing AndAlso Object.Load() 

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

Curiosamente, ninguna de las respuestas mencionó que And y Or en VB.NET son operadores de bits, mientras que OrElse y AndAlso son estrictamente operadores 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 distinto de cero se considera true ; Dim e = not 0 establecerá e en -1 demostrando que Not también es un operador de bit.

|| 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 modismo v || 5 v || 5 en C # para dar 5 como el valor de la expresión cuando v es null o ( 0 y un entero) y el valor de v caso contrario. La diferencia en semántica puede atrapar a un progtwigdor de C # incursionando en VB.NET desprevenido ya que este “idioma de valor predeterminado” no funciona en VB.NET.

Entonces, para responder a la pregunta : Use Or y And para operaciones de bits (entero o booleano). Use OrElse y también AndAlso “cortocircuite” una operación para ahorrar tiempo, o pruebe la validez de una evaluación antes de evaluarla. If valid(evaluation) andalso evaluation then o if not (unsafe(evaluation) orelse (not evaluation)) then

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

 Dim e = Not 0 And 3 
 If Bool1 And Bool2 Then 

Evalúa Bool1 y Bool2

 If Bool1 AndAlso Bool2 Then 

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

Solo para todas aquellas personas que dicen que los efectos secundarios son malvados: 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 consum una fila cada vez que se verifique la condición. Mientras que AndAlso podría leer la última línea de File1 y salir de 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 un código ” malo ” o ” malo ” como algunos lo llevarían a creer. Es fácil de leer y eficiente.

Una manera simple de pensar es utilizar 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 se parece mucho a Y, 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 “en cortocircuito”.

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

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

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

También vea Pregunta de desbordamiento de stack: ¿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 la izquierda en lugar de usar “Y”. Solo necesitas “Y” si ambos lados tienen efectos secundarios. Y si tienes tantos efectos secundarios, probablemente estés haciendo algo diferente. En general, realmente deberías preferir a AndAlso.

Además de las respuestas anteriores, AndAlso también proporciona un proceso de acondicionamiento conocido como cortocircuito. Muchos lenguajes de progtwigción tienen esta funcionalidad incorporada como lo hace vb.net, y pueden proporcionar aumentos de rendimiento sustanciales en las declaraciones de condición larga mediante la eliminación de evaluaciones innecesarias.

Otra condición similar es la condición de OrElse, que solo verificaría la condición correcta si la condición de la izquierda es falsa, por lo que se eliminarán las verificaciones de condición innecesarias después de que se encuentre una condición verdadera.

Te aconsejaría usar siempre procesos de cortocircuito y estructurar tus enunciados condicionales de manera que puedan ser los más beneficiados por esto. Por ejemplo, pruebe primero las condiciones más eficientes y más rápidas para que solo ejecute sus largas condiciones cuando sea absolutamente necesario y cortocircuite las otras veces.

Para la mayoría de nosotros, OrElse y AndAlso harán el truco a excepción de unas pocas excepciones confusas (menos del 1% donde tendremos que usar O y E).

Trate de no dejarse llevar por la gente mostrando sus lógicas booleanas y haciendo que parezca una ciencia de cohetes.

Es bastante simple y sencillo y, ocasionalmente, su sistema puede no funcionar como se espera porque, en primer lugar, no le gusta su lógica. Y, sin embargo, su cerebro le sigue diciendo que su lógica está probada y probada al 100% y debería funcionar. En ese momento deja de confiar en tu cerebro y pídele que piense de nuevo o (no OrElse o quizás OrElse) te fuerces a buscar otro trabajo que no requiera mucha lógica.