Compartir a través de


Mecanismo para pasar parámetros para usuarios de Visual Basic 6.0

Actualización: noviembre 2007

Visual Basic 2008 presenta varios cambios que afectan a la forma en que los argumentos se transfieren a los procedimientos.

Mecanismo predeterminado para pasar argumentos

Visual Basic 6.0

En Visual Basic 6.0, si no especifica ByVal o ByRef en un parámetro de procedimiento, toma de manera predeterminada ByRef. Esto permite al procedimiento modificar la variable pasada en el programa de llamada.

Exponer una variable a modificación puede suponer un riesgo. En el ejemplo siguiente, el mecanismo para pasar argumentos asigna ByRef de forma predeterminada, minutesPastHour modifica el valor de elapsedSeconds y MsgBox muestra de forma incorrecta elapsedSeconds.

Function minutesPastHour(seconds As Integer) As Integer 
    Dim hours As Integer = seconds \ 3600 
    seconds = seconds Mod 3600 
    Return seconds \ 60 
End Function 
Sub showSecondsAndMinutes() 
    Dim elapsedSeconds, extraMinutes As Integer 
    elapsedSeconds = CInt(Timer()) ' Integer seconds since midnight. 
    extraMinutes = minutesPastHour(elapsedSeconds) 
    MsgBox "Total seconds: " & elapsedSeconds & _ 
        "; minutes past hour: " & extraMinutes 
End Sub 

Si se pasa un argumento ByRef, se permite a los procedimientos cambiarlos en el programa de llamada, lo que puede llevar a un comportamiento inesperado. Y si ese procedimiento llama a otro procedimiento y pasa el mismo argumento ByRef, aumentan las ocasiones de modificación sin intención de la variable original.

Visual Basic 2008

Cuando declara un procedimiento en Visual Basic 2008, el mecanismo para pasar argumentos asigna ByVal como valor predeterminado en cada parámetro. De este modo se protegen los argumentos frente a modificaciones. La declaración del ejemplo anterior se puede volver a escribir de la siguiente forma.

Function MinutesPastHour(ByVal Seconds As Integer) As Integer

Si se pasa seconds por valor, se impide que el procedimiento tenga acceso a la variable en el programa de llamada y sirve para evitar los riesgos descritos.

Aunque ByVal es el mecanismo predeterminado, si lo especifica explícitamente para todos los parámetro, se elimina la incertidumbre y el código se hace más legible.

Argumentos de la propiedad ByRef

Visual Basic 6.0

En Visual Basic 6.0, las propiedades pasadas a los procedimientos como argumentos ByRef se copian al procedimiento, pero no desde el procedimiento. Esto significa que cualquier modificación a dicho argumento de propiedad no se reflejará en la propiedad original del programa de llamada, aún cuando se pase ByRef.

Visual Basic 2008

En Visual Basic 2008, un argumento de propiedad que se pasa ByRef se copia dentro y fuera del procedimiento. El ejemplo siguiente muestra cómo los procedimientos pueden cambiar las propiedades.

Sub Reduce(ByRef Height As Single)
' ... ... ... ... ... ... ...  ' Code to modify Height argument. 
End Sub
Dim Sq As Square = New Square  ' Square has property Side of type Single. 
Reduce(Sq.Side)                ' Side is changed when Reduce returns. 

Cuando un procedimiento modifica un argumento de propiedad, el valor de la propiedad original no cambia inmediatamente en el programa de llamada. En su lugar, se copia externamente cuando lo devuelve el procedimiento.

Argumentos ParamArray

Visual Basic 6.0

En Visual Basic 6.0, un procedimiento puede especificar la palabra clave ParamArray en el último de sus argumentos para aceptar una matriz de argumentos Variant. No puede declarar el mecanismo de paso de parámetros de estos argumentos. Siempre se pasan ByRef.

Visual Basic 2008

En Visual Basic 2008, los argumentos ParamArray siempre se pasan ByVal. Todos los argumentos de la matriz deben ser del tipo de datos del argumento ParamArray.

Vea también

Conceptos

Declaración de procedimiento para usuarios de Visual Basic 6.0

Secuencia de llamada a procedimientos para usuarios de Visual Basic 6.0

Matrices de parámetros

Resumen de cambios de los elementos de programación ofrecidos

Referencia

Instrucción Function (Visual Basic)

Instrucción Sub (Visual Basic)

ByVal

ByRef

ParamArray