Pregunta

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

¿Fue útil?

Solución

El operador Y 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 como usarías & amp; & amp; .

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

Otros consejos

El operador Y 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).

Generalmente 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 marca. Por ejemplo:

If Not Object Is Nothing AndAlso Object.Load()

Si usara Y en lugar de AndAlso , aún intentaría Object.Load () incluso si fuera nada , que arrojaría una excepción.

Curiosamente, ninguna de las respuestas mencionó que Y y O 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 verdadero ; Dim e = not 0 establecerá e en -1 demostrando que Not también es un operador de bits.

|| y & amp; & amp; (las versiones C # de OrElse y AndAlso ) devuelven el último expresión evaluada que sería 3 y 5 respectivamente. Esto le permite usar el idioma v || 5 en C # para dar 5 como el valor de la expresión cuando v es nulo o ( 0 y un número entero) y el valor de v de lo contrario. La diferencia en la semántica puede pillar a un programador de C # jugando con VB.NET desprevenido, ya que este '' idioma de valor predeterminado '' no funciona en VB.NET.

Entonces, para responder la pregunta : use O y Y para operaciones de bit (entero o booleano). Utilice OrElse y AndAlso para " cortocircuito " una operación para ahorrar tiempo o probar la validez de una evaluación antes de evaluarla. Si es válido (evaluación) y también evaluación entonces o si no (inseguro (evaluación) orelse (no evaluación)) entonces

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

Dim e = Not 0 And 3
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.

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 Y garantiza que se consuma una fila cada vez que se verifica la condición. Mientras que AndAlso podría 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 " malo " o " mal " código como algunos te llevarían a creer. Es fácil de leer y eficiente.

Una forma sencilla 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

AndTambién es muy parecido a And, excepto que funciona como & amp; & amp; 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, p. en una expresión como:

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

El uso del antiguo Y en la expresión anterior arrojaría una NullReferenceException si myObj fuera nulo.

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

También: Un comentario para aquellos que mencionaron usar Y 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 " ;. Solo necesitas realmente "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.

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 la manera que más se beneficie con esto. 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.

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

Intenta no dejarte 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 le sigue diciendo 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top