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

Respuestas:

380

El Andoperador evalúa ambos lados, donde AndAlsoevalú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 de C #, debes usarlo AndAlsocomo lo harías &&.

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

Nico
fuente
2
El enlace "Más información" está roto. Aquí está la nueva URL: panopticoncentral.net/2003/08/18/…
Rory O'Kane
12
¿Alguien sabe por qué no han elegido "AndThen" en su lugar? Creo que esto sería más intuitivo.
tmighty
77
Siempre he pensado que esto era contrario a la intuición. ¡Y también implicaría que va a verificar ambos y esto debería ser al revés! De ahí por qué tengo que venir a SO para verificar cosas como esta (sí, soy un chico # ac). Tampoco debería tener que hacer una pregunta como "diferencia entre And y AndAlso". Demasiados ands! Mi profesor de inglés me habría matado
Robin French
3
Cada vez que uso OrElse siempre pienso en South Park "¿O si no qué?" "Exactamente"
Robin French
1
@tmighty adivinando que causaría más confusión porque Thenes su propia palabra clave.
binki
29

El Andoperador 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 ambas son verdaderas.

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

If Not Object Is Nothing AndAlso Object.Load()

Si eso se usara en Andlugar de AndAlso, aún lo intentaría Object.Load()incluso si fuera así nothing, lo que arrojaría una excepción.

Ed Marty
fuente
14
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.
Joel Coehoorn el
1
Primero, Andalso no se usa principalmente para 'ahorrar en tiempo de ejecución', eso es absurdo. En segundo lugar, hacer que el segundo argumento realice algún "efecto secundario" útil es una mala práctica.
Tor Haugen el
2
Sin embargo, no puede argumentar que no 'ahorra tiempo de ejecución'. Y he encontrado situaciones en las que los efectos secundarios son, de hecho, no una mala práctica desagradable.
Ed Marty el
1
"En general, las personas usan el método de cortocircuito si hay una razón para no verificar explícitamente la segunda parte" Erm, ¿qué? ¡Espero que las personas usen cortocircuitos a menos que tengan una razón para no hacerlo! Nadie debería usar el viejo and/ a ormenos 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 ...
underscore_d
20

Curiosamente ninguna de las respuestas mencionó que Andy Oren VB.NET son los operadores de bits, mientras que OrElsey AndAlsoson 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 : se considera un número entero distinto de cero true; Dim e = not 0establecerá epara -1demostrar Nottambién es un operador de bits.

||y &&(las versiones de C # de OrElsey AndAlso) devuelven la última expresión evaluada que sería 3y 5respectivamente. Esto le permite usar el idioma v || 5en C # para dar 5como valor de la expresión cuando vis nullo ( 0y un número entero) y el valor de lo vcontrario. 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 Ory Andpara operaciones de bit (entero o booleano). Use OrElsey AndAlsopara "cortocircuitar" una operación para ahorrar tiempo, o pruebe la validez de una evaluación antes de evaluarla. If valid(evaluation) andalso evaluation thenoif not (unsafe(evaluation) orelse (not evaluation)) then

Bonificación: ¿Cuál es el valor de lo siguiente?

Dim e = Not 0 And 3
Charles Jacks
fuente
Creo que te has confundido ||y &&con ??. Si bien hay idiomas donde ||devolverá el valor no falsey, C # no es uno de ellos, y devuelve un bool(a excepción de los operadores anulables levantados, donde obtienes un Nullable<bool>resultado)
Ben Voigt
14
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.

Bryan Anderson
fuente
13

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.

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

El uso de Andasegura que se consume una fila cada vez que se verifica la condición. Mientras que AndAlsopodría leer la última línea de File1y dejar File2sin 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.

Ian
fuente
5

Una manera simple de pensarlo es usar un inglés incluso más claro

If Bool1 And Bool2 Then
If [both are true] Then


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then
rbrill
fuente
3
¡El inglés es más confuso que el código porque no tiene una especificación!
binki
5

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:

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.

Tor Haugen
fuente
5

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 Andsi 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.

Joel Coehoorn
fuente
3

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.

davidallyoung
fuente
También vale la pena mencionar el IIF (Inmediato If) porque no produce un cortocircuito y puede crear condiciones muy diferentes a la intención del programador, ya que se evalúan los componentes verdadero y falso. Anteriormente, alguien declaró que usan este comportamiento de efectos secundarios intencionalmente, pero no lo veo como un método efectivo, ya que el If inmediato no tiene la intención intencional de realizar la evaluación de esa manera que yo pueda detectar.
jinzai
"Además de las respuestas anteriores, AndAlso también proporciona un proceso de acondicionamiento conocido como cortocircuito". Cada respuesta anterior a esta se centra en cortocircuito. : P Pero buena descripción y recomendaciones.
underscore_d
1

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.

Anand
fuente
0

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.

Albahaca
fuente