¿Cuál es la diferencia entre Y y también en VB.NET?


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

Author: Peter Mortensen, 2008-11-19

10 answers

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 lanza una excepción.

Así que si vienes del mundo de C#, deberías usar AndAlso como usarías &&.

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

 336
Author: Nico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-21 10:10:19

El operador And verificará todas las condiciones en la instrucció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, entonces 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.)

Generalmente la gente usa 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 lanzaría una excepción si está marcada. Por ejemplo:

If Not Object Is Nothing AndAlso Object.Load()

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

 28
Author: Ed Marty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-07 20:47:48

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 : se considera un entero distinto de cerotrue; Dim e = not 0 will set e to -1 demonstrating Not is also a bit operator.

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

Por lo tanto, para responder a la pregunta: Use 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 previa para evaluarlo. 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
 13
Author: Charles Jacks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-07 20:54:50
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 true.

 12
Author: Bryan Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-19 14:42:59

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

Utilizando el And se asegura de que una fila se consume cada vez que se comprueba 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 le llevaría a creer. Es fácil de leer y eficiente.

 12
Author: Ian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-17 17:44:20

Una forma sencilla de pensar en ello es usar un inglés aún más sencillo

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


If Bool1 AndAlso Bool2 Then
If [first is true then evaluate the second] Then
 4
Author: rbrill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-14 10:44:51

Y también 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 "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 la expresión old And en la anterior arrojaría una excepción NullReferenceException si myObj fuera null.

 4
Author: Tor Haugen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-07 20:50:05

También vea la pregunta de desbordamiento de pila: ¿Debo usar siempre los operadores AndAlso y OrElse?.

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

Si el lado derecho tiene un efecto secundario que necesita, simplemente muévalo al lado izquierdo en lugar de usar "Y". Solo necesita " Y " si ambos lados tienen efectos secundarios. Y si usted tiene que muchos efectos secundarios pasando usted está haciendo probablemente algo peor. En general, usted realmente debe preferir AndAlso.

 4
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:22

Además de las respuestas anteriores, y también proporciona un proceso de acondicionamiento conocido como cortocircuito. Muchos lenguajes de programación tienen esta funcionalidad incorporada como vb.net lo hace, y también puede proporcionar un rendimiento sustancial aumenta en declaraciones de problemas largos mediante la reducción de las evaluaciones que son innecesarias.

Otra condición similar es la condición OrElse que solo verificaría la condición derecha si la condición izquierda es falsa, eliminando así las comprobaciones de condición innecesarias después de encontrar una condición verdadera.

Le aconsejaría que siempre use procesos de cortocircuito y estructure sus declaraciones condicionales de maneras que puedan beneficiarse al máximo 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 realice un cortocircuito las otras veces.

 2
Author: davidallyoung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-16 19:01:56

Para la mayoría de nosotros, OrElse y AndAlso harán el truco, excepto por algunas excepciones confusas (menos del 1% donde podemos tener que usar Or y Y).

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

Es bastante simple y directo y ocasionalmente su sistema puede no funcionar como se esperaba porque no le gusta su lógica en primer lugar. Y sin embargo tu cerebro sigue diciéndote que su lógica es 100% probado y probado y debería funcionar. En ese mismo momento deja de confiar en tu cerebro y pídele que lo piense de nuevo o (no OrElse o tal vez OrElse) te obligas a buscar otro trabajo que no requiera mucha lógica.

 0
Author: Anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-11 17:41:35