Cómo: Proteger un argumento de procedimiento para que no se realicen cambios de valor (Visual Basic)
Si un procedimiento declara un parámetro como 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. Esto permite al procedimiento cambiar el valor subyacente al argumento en el código de llamada. En algunos casos, es posible que el código de llamada quiera protegerse frente a este cambio.
Siempre puede proteger un argumento del cambio declarando el parámetro correspondiente ByVal en el procedimiento. Si desea poder cambiar un argumento determinado en algunos casos, pero no otros, puede declararlo ByRef
y dejar que el código de llamada determine el mecanismo de paso en cada llamada. Para ello, incluye el argumento correspondiente entre paréntesis para pasarlo por valor o no incluirlo entre paréntesis para pasarlo por referencia. Para obtener más información, vea Procedimiento para forzar un elemento para que pase como un valor.
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. Sin embargo, la reasignación no afecta a la variable de matriz subyacente en el código que realiza la llamada.
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(ByVal 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, increase
puede cambiar sus miembros, aunque el mecanismo de paso sea ByVal
.
La segunda MsgBox
llamada muestra «After replace(n): 11, 21, 31, 41». Dado que n
se pasa ByVal
, replace
no se puede modificar la variable n
en el código de llamada mediante la asignación de una nueva matriz a ella. Cuando replace
crea la nueva instancia k
de matriz y la asigna a la variable a
local, pierde la referencia a n
pasada por el código que realiza la llamada. Cuando cambia los miembros de a
, solo se ve afectada la matriz k
local. Por lo tanto, replace
no incrementa los valores de la matriz n
en el código que realiza la llamada.
Compilar el código
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.
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 cambiar el valor de un argumento de procedimiento
- 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