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 alocal, 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