En esta situación:
Código
Lo lógico sería que al leer A=True no comprobara Lo siguiente puesto que la condición se cumpliría de todas formas.
If A = True Or B = False Then
Pero no, vb te comprueba TODO el If pase lo que pase en todos los casos.
Aquí un código que lo demuestra:
Código
Option Explicit Private Function OrTest(ByVal bReturn As Boolean) As Boolean '// Imprimo un texto para saber que he pasado por la función. Debug.Print Time$, "Función con el argumento " & bReturn & " llamada." OrTest = bReturn End Function Private Sub Form_Load() '// Aquí lo logico sería comprobar las dos ya que '// si la primera no es true, lo puede ser la segunda. If OrTest(False) Or OrTest(False) Then '// Nothing End If Debug.Print String$(75, "=") '// Lo lógico sería que se saltase la segunda función puesto '// que la primera es true, pero no, nuestro querido vb '// comprueba igual... If OrTest(True) Or OrTest(False) Then '// Nothing End If End Sub
Retorno:
Código:
00:27:48 Función con el argumento Falso llamada.
00:27:48 Función con el argumento Falso llamada.
===========================================================================
00:27:48 Función con el argumento Verdadero llamada.
00:27:48 Función con el argumento Falso llamada.
Sé que alguno dirá: ¿y a mí qué más me da si el resultado es el mismo?
Bueno, pues imagina que tienes un If tal que así:
Código
La función Calculo() es un algoritmo complejo y tarda 1 segundo de media.
If Calculo(1) Or Calculo(2) Or Calculo(3) Or Calculo(4) Or Calculo(5) Then '... End If
Si fuera otro lenguaje de programación si Calculo(1) es true se saltaría los demás, pero nuestro querido vb6 llamará a todas las demás funciones perdiendo tiempo innecesariamente... Pasando de 1 seg a 5 en este caso.
La alternativa que propongo en estos casos es (no son agradables a la vista, aviso ) :
Sustituir esto:
Código
If A(324) = 45 Or B(12) = 2 Or B(4563) = 56 Then Call DoIt End If
Por esto:
Código
If A(324) = 45 Then Call DoIt ElseIf B(12)=2 Then Call DoIt ElseIf B(4563) = 56 Then Call DoIt End If
Esto:
Código
If A(324) = 45 And B(12) = 2 And B(4563) = 56 Then '... End If
Por esto:
Código
Con esto no quiero decir que lo hagáis así de normal, sólo cuando necesitemos velocidad.
If A(324) = 45 Then If B(12) = 2 Then If B(4563) = 56 Then '... End If End If End If
Hice estas pruebas a ver si algún lenguaje más era tonto, pero por ahora sólo es vb6.
Si alguien sabe de otro hacedmelo saber, me interesa mucho.
Dedico este articulo a Karcrack, BlackZero, TheSwash y raul338 por orientarme y ayudarme con los test.
VB.NET tiene una expresion para evitar esto:
Código:
Short-Circuiting Logical Operations http://msdn.microsoft.com/en-us/library/wz3k228a.aspx
Más info:
Código:
http://en.wikipedia.org/wiki/Short-circuit_evaluation
Espero que al menos a alguien le sirva todo esto.
DoEvents!