vb.net - not - if then else visual basic
EvaluaciĆ³n de una declaraciĆ³n IF en VB.NET (3)
Para las siguientes sentencias If en VB.NET, ¿cuál será la secuencia en la que se evaluarán las condiciones?
Caso 1:
If ( condition1 AND condition2 AND condition3 )
.
.
End If
Caso 2
If ( condition1 OR condition2 OR condition3 )
.
.
End If
Caso 3:
If ( condition1 OR condition2 AND condition3 OR condition4)
.
.
End If
VB.Net evalúa todas las condiciones, por lo que el orden no es importante aquí.
Si desea usar un cortocircuito, use las palabras clave AndAlso y OrElse.
VB.NET es una bestia muy extraña desde el punto de vista del programador C. Como mencionó Gerrie en una respuesta diferente, las tres condiciones se evalúan en su totalidad sin cortocircuitos. YAlso y OrElse pueden salvarte el día si eso es lo que quieres.
En cuanto a la última si , el orden de evaluación es el siguiente:
If ((condition1 OR (condition2 AND condition3)) OR condition4)
Como regla general: si hay alguna ambigüedad, use corchetes para especificar el orden de evaluación de forma explícita.
Esto no responde exactamente a la pregunta que nos ocupa, ya que ya fue respondida, sentí la necesidad de ampliar la palabra clave ''OrElse'', mencionada por Anton, y también es relativa: ''Y también'', porque alguien que aterriza en esta pregunta en realidad quiero una explicación sobre esto.
''OrElse'' y ''AndAlso'' son útiles si requiere una evaluación ordenada explícitamente.
A diferencia de ''O'' y ''E'', si todas las expresiones se evalúan, la instrucción If puede omitir las expresiones restantes si la primera expresión se evalúa con el valor deseado, cuando se usa ''OrElse'' o ''AndAlso''.
En el siguiente caso, el orden de las expresiones es aplicable a ''OrElse'' de izquierda a derecha, pero tampoco siempre evalúa todas las expresiones en función del resultado del valor anterior:
if( Expression1 orelse Expression2 orelse Expression3 )
'' Code...
End If
Si Expression1 es verdadero, entonces Expression 2 y 3 son ignorados. Si Expression1 es False, entonces se evalúa Expression2, y luego Expression3 si Expression2 se evalúa como True.
If (False OrElse True OrElse False ) then
'' Expression 1 and 2 are evaluated, Expression 3 is ignored.
End If
If (True OrElse True OrElse True ) then
'' only Expression 1 is evaluated.
End If
If (True OrElse True OrElse True ) then
'' only Expression 1 is evaluated.
End If
If (False OrElse False OrElse True ) then
'' All three expressions are evaluated
End If
Un ejemplo alternativo del uso de ''OrElse'':
If( (Object1 is Nothing) OrElse (Object2 is Nothing) OrElse (Object3 is Nothing) ) then
'' At least one of the 3 objects is not null, but we dont know which one.
'' It is possible that all three objects evaluated to null.
'' If the first object is null, the remaining objects are not evaluated.
'' if Object1 is not NULL and Object2 is null then Object3 is not evaluated
Else
'' None of the objects evaluated to null.
Endif
El ejemplo anterior es el mismo que el siguiente:
If(Object1 Is Nothing)
'' Object 1 is Nothing
Return True
Else
If(Object2 Is Nothing)
'' Object 2 is Nothing
Return True
Else
If(Object3 Is Nothing)
'' Object 3 is Nothing
Return True
Else
'' One of the objects evaluate to null
Return False
End If
End If
End If
También está la palabra clave AndALso :
'' If the first expression evaluates to false, the remaining two expressions are ignored
If( Expression1 AndAlso Expression2 AndAlso Expression3 ) Then ...
Que se puede usar así:
If( (Not MyObject is Nothing) AndAlso MyObject.Enabled ) Then ...
'' The above will not evaluate the ''MyObject.Enabled'' if ''MyObject is null (Nothing)''
'' MyObject.Enabled will ONLY be evaluated if MyObject is not Null.
'' If we are here, the object is NOT null, and it''s Enabled property evaluated to true
Else
'' If we are here, it is because either the object is null, or it''s enabled property evaluated to false;
End If
A diferencia de ''And'', como ''Or''- siempre evaluará todas las expresiones:
If( (Not MyObject is Nothing) And MyObject.Enabled ) Then ...
'' MyObject.Enabled will ALWAYS be evaluated, even if MyObject is NULL,
'' --- which will cause an Exception to be thrown if MyObject is Null.
End If
Pero debido a que el orden puede tener un efecto con ''OrElse'' y ''AndAlso'', la evaluación del tiempo en que un objeto es nulo debe hacerse primero, como en los ejemplos anteriores.
Lo siguiente causará una excepción si ''MyObject'' es NUll
Try
If( MyObject.Enabled AndAlso (Not MyObject is Nothing) ) Then ...
'' This means that first expression MyObject.Enabled Was evaluated to True,
'' Second Expression also Evaluated to True
Else
'' This means MyObject.Enabled evaluated to False, thus also meaning the object is not null.
'' Second Expression "Not MyObject is Nothing" was not evaluated.
End If
Catch(e as Exception)
'' An exception was caused because we attempted to evaluate MyObject.Enabled while MyObject is Nothing, before evaluating Null check against the object.
End Try
POR FAVOR comente si cometí un error o error tipográfico aquí, ya que escribí esto a las 5:16 AM de la mañana después de 2 días sin dormir.