2012-04-21 17 views
11

Estoy luchando por comprender el valor de paso por paso y por referencia en VB6. Entiendo estos conceptos completamente en lenguajes de programación orientados a objetos como .NET y Java (me doy cuenta de que Java no tiene acceso por referencia). Eche un vistazo al siguiente código:VB6 pase por valor y pase por referencia

Private Sub Form_Load() 

Dim Test As Integer 
Test = 1 
TestFunction Test 'line 5 
MsgBox (Test) 

End Sub 

Private Sub TestFunction(ByVal i As Integer) 
    i = i + 1 
End Sub 

El cuadro de mensaje imprime 1 como era de esperar. Si pongo corchetes alrededor de Prueba en la línea 5, el cuadro de mensaje imprime 1 como era de esperar. Ahora echa un vistazo en el código de abajo:

Private Sub Form_Load() 

Dim Test As Integer 
Test = 1 
TestFunction Test 'line 5 
MsgBox Test 

End Sub 

Private Sub TestFunction(ByRef i As Integer) 
    i = i + 1 
End Sub 

El mensaje de impresiones de la caja 2 como me esperaba. Sin embargo, si agrega corchetes a la línea 5, el cuadro de mensaje imprime 1 como no esperaba. Parece que la función de llamada puede pasar por valor incluso si la variable definida en la función llamada es ByRef. Parece que no es el caso viceversa, es decir, si la función llamada tiene una firma con una variable definida como ByVal, entonces siempre será ByVal (incluso si no hay corchetes alrededor de la variable en la función de llamada). ¿Cuál es el pensamiento detrás de esto en VB6? Me doy cuenta de que esta es una pregunta básica en VB6 pero me ha confundido. He leído la documentación de MSDN y me doy cuenta de que todo esto es cierto, sin embargo, no explica el razonamiento detrás de esto.

Respuesta

16

Esto es un gotcha clásico en VB6. Es explained in the VB6 manual. En este código de abajo, VB6 trata el argumento como un expresión (Test) en lugar de una referencia variable

TestFunction (Test) 

Con el fin de pasar una referencia a la variable o bien omitir los soportes o utilizar el legado Call statement (que requiere entre paréntesis)

TestFunction Test 
Call TestFunction(Test) 

VB6 le permite pasar a las expresiones ByRef argumentos incluso si el método de ellas cambios. Por ejemplo, puede escribir

TestFunction (Test + 2) 

El compilador crea una copia temporal y la pasa por referencia. VB.Net uses brackets in a similar way.

También puede obtener el compilador para crear copias temporales si TestFunction toma dos argumentos como este:

TestFunction (one), (two) 

y se puede obtener copias temporales, incluso con Call si se duplica sus soportes, la adición de un par innecesario adicional:

Call TestFunction((Test)) 
+0

Gracias. Esto es útil. ¿Cuál es el propósito de la función de llamada? ¿Esto significa que la variable pasada nunca será tratada como una expresión? Estoy sorprendido por esto ya que nunca antes lo había pensado realmente. Además, si hay más de una variable para pasar, entonces supongo que no puede incluir una expresión. – w0051977

+2

No estoy seguro de cómo se trata de un "error", ya que está documentado, el comportamiento intencional. La palabra clave Call es heredada y obsoleta, y se remonta a principios básicos de MS. Estaba allí para facilitar la migración de viejos programas hacia adelante. – Bob77

+2

La palabra clave 'Call' no tiene ninguna relación ya sea que los argumentos se traten o no como expresiones. Simplemente usa paréntesis como la forma de pasar argumentos, por lo que un par de paréntesis tiene un significado diferente. Pero los paréntesis alrededor de un argumento producen una expresión igual que sin la palabra clave 'Call'. –

6

Encerrando cualquier expresión entre paréntesis hace que la expresión que se evalúa en primer lugar antes de hacer cualquier otra cosa, incluso cuando esa expresión no es más que una variable única. En su caso, el resultado de esa expresión se pasa como un argumento.

Por lo tanto, está pasando el argumento por referencia. Pero el argumento que está pasando es el resultado de la expresión y no de la variable original. Esta es la razón por la cual la variable original no se actualiza.

Cuestiones relacionadas