Cómo: Cambiar el valor de un argumento de procedimiento (Visual Basic)
Cuando se llama a un procedimiento, cada argumento proporcionado corresponde a uno de los parámetros definidos en el procedimiento. En algunos casos, el código de procedimiento puede cambiar el valor subyacente a un argumento en el código de llamada. En otros casos, el procedimiento solo puede cambiar su copia local de un argumento.
Al llamar al procedimiento, Visual Basic realiza una copia local de cada argumento que se pasa a ByVal. Para cada argumento pasado ByRef, Visual Basic proporciona al código de procedimiento una referencia directa al elemento de programación subyacente al argumento en el código de llamada.
Si el elemento subyacente del código de llamada es un elemento modificable y se pasa el argumento ByRef
, el código de procedimiento puede usar la referencia directa para cambiar el valor del elemento en el código de llamada.
Cambiar el valor subyacente
Para cambiar el valor subyacente de un argumento de procedimiento en el código de llamada
En la declaración de procedimiento, especifica ByRef para el parámetro correspondiente al argumento.
En el código de llamada, pasa un elemento de programación modificable como argumento.
En el código de llamada, no incluyas el argumento entre paréntesis en la lista de argumentos.
En el código de procedimiento, usa el nombre del parámetro para asignar un valor al elemento subyacente en el código de llamada.
Consulta el ejemplo más abajo para ver una demostración.
Cambiar copias locales
Si el elemento subyacente del código de llamada es un elemento no modificable o si se pasa el argumento ByVal
, el procedimiento no puede cambiar su valor en el código de llamada. Sin embargo, el procedimiento puede cambiar su copia local de este argumento.
Para cambiar la copia de un argumento de procedimiento en el código del procedimiento
En la declaración de procedimiento, especifica ByVal para el parámetro correspondiente al argumento.
O bien
En el código de llamada, incluye el argumento entre paréntesis en la lista de argumentos. Esto obliga a Visual Basic a pasar el argumento por valor, incluso si el parámetro correspondiente especifica
ByRef
.En el código del procedimiento, use el nombre del parámetro para asignar un valor a la copia local del argumento. No se cambia el valor subyacente en el código de llamada.
Ejemplo
En el ejemplo siguiente se muestran dos procedimientos que toman una variable de matriz y operan en sus elementos. El increase
procedimiento simplemente agrega uno a cada elemento. El replace
procedimiento asigna una nueva matriz al parámetro a()
y, a continuación, agrega una a cada elemento.
Public Sub increase(ByVal a() As Long)
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Public Sub replace(ByRef a() As Long)
Dim k() As Long = {100, 200, 300}
a = k
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
La primera MsgBox
llamada muestra «After increase(n): 11, 21, 31, 41». Dado que la matriz n
es un tipo de referencia, replace
puede cambiar sus miembros, aunque el mecanismo de paso sea ByVal
.
La segunda MsgBox
llamada muestra «After replace(n): 101, 201, 301». Dado que n
se pasa ByRef
, replace
no se puede modificar la variable n
en el código de llamada mediante la asignación de una nueva matriz a ella. Dado que n
es un tipo de referencia, replace
también puedes cambiar sus miembros.
Puedes impedir que el procedimiento modifique la propia variable en el código de llamada. Consulta Cómo: Proteger un argumento de procedimiento para que no se realicen cambios de valor.
Compilar el código
Si pasas una variable por referencia, debes usar la palabra clave ByRef
para especificar este mecanismo.
El valor predeterminado en Visual Basic es pasar argumentos por valor. Sin embargo, es recomendable incluir la palabra clave ByVal o ByRef con todos los parámetros declarados. Ello facilita la lectura del código.
Seguridad de .NET Framework
Siempre hay un riesgo potencial al permitir que un procedimiento cambie el valor subyacente de un argumento en el código de llamada. Asegúrate de que esperas que se cambie este valor y estate preparado para comprobar su validez antes de usarlo.
Consulte también
- Procedimientos
- Argumentos y parámetros de procedimiento
- Procedimiento para pasar argumentos a un 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
- Procedimiento para proteger un argumento de procedimiento para que no se realicen cambios de valor
- Procedimiento para forzar un argumento para que pase como un valor
- Paso de argumentos por posición o por nombre
- Value Types and Reference Types