Cómo: Forzar un argumento para que pase como un valor
Actualización: noviembre 2007
El mecanismo para pasar argumentos se determina en la declaración del procedimiento. Si un parámetro se declara ByRef, Visual Basic espera transferir el argumento correspondiente por referencia. Esto permite al procedimiento cambiar el valor del elemento de programación subyacente al argumento en el código de llamada. Si desea proteger el elemento subyacente frente a un cambio de este tipo, puede encerrar entre paréntesis el nombre del argumento en lugar de utilizar el mecanismo para pasar argumentos ByRef en la llamada al procedimiento. Estos paréntesis son distintos de los paréntesis que encierran la lista de argumentos en la llamada.
El código de llamada no puede reemplazar un mecanismo ByVal.
Para forzar un argumento para que pase por valor
Si el parámetro correspondiente se declara ByVal en el procedimiento, no es necesario realizar pasos adicionales. Visual Basic ya tiene previsto transferir el argumento por valor.
Si el parámetro correspondiente se declara ByRef en el procedimiento, incluya el argumento entre paréntesis en la llamada al procedimiento.
Ejemplo
En el ejemplo siguiente se reemplaza una declaración del parámetro ByRef. En la llamada que obliga a utilizar ByVal, tenga en cuenta los dos niveles de paréntesis.
Sub setNewString(ByRef inString As String)
inString = "This is a new value for the inString argument."
MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"
' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)
' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)
Cuando str está encerrado entre paréntesis adicionales dentro de la lista de argumentos, el procedimiento setNewString no puede cambiar su valor en el código de llamada, y MsgBox muestra "Cannot be replaced if passed ByVal". Cuando str no está incluido entre paréntesis adicionales, el procedimiento no puede cambiarlo, y MsgBox muestra "This is a new value for the inString argument".
Compilar el código
Cuando se pasa una variable por referencia, debe utilizarse la palabra clave ByRef para especificar este mecanismo.
En Visual Basic, los argumentos se pasan por valor de forma predeterminada. Sin embargo, es una práctica de programación recomendable incluir la palabra clave ByVal o ByRef con cada parámetro declarado. De este modo, el código resulta más fácil de leer.
Programación eficaz
Si un procedimiento declara un parámetro ByRef, la ejecución correcta del código dependerá de si es capaz de cambiar el elemento subyacente en el código de llamada. Si el código de llamada sustituye este mecanismo de llamada encerrando el argumento entre paréntesis, o si transfiere un argumento que no se puede modificar, el procedimiento no puede cambiar el elemento subyacente. Esto podría generar resultados inesperados en el código de llamada.
Seguridad
Existe siempre el riesgo potencial de permitir que un procedimiento cambie el valor subyacente a un argumento en el código de llamada. Asegúrese de que tiene previsto que este valor se modifique y prepárese para comprobar su validez antes de utilizarlo.
Vea también
Tareas
Cómo: Pasar argumentos a un procedimiento
Cómo: Cambiar el valor de un argumento de procedimiento
Cómo: Proteger un argumento de procedimiento para que no se realicen cambios de valor
Conceptos
Procedimientos en Visual Basic
Argumentos y parámetros de procedimiento
Pasar argumentos por valor y por referencia
Diferencias entre argumentos modificables y no modificables
Diferencias entre pasar un argumento por valor y por referencia