Compartir a través de


Cómo: Proteger un argumento de procedimiento para que no se realicen cambios de valor

Actualización: noviembre 2007

Si un procedimiento declara un parámetro ByRef, Visual Basic proporciona al código del 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 probable que se desee proteger el código de llamada frente a este tipo de cambios.

Para proteger un argumento y que no se efectúen cambios, puede declarar el parámetro correspondiente ByVal en el procedimiento. Si desea poder cambiar un determinado argumento en algunos casos pero no en otros, puede declararlo ByRef y permitir que el código de llamada determine el mecanismo para pasar argumentos en cada llamada. Para ello, incluya el argumento correspondiente entre paréntesis para transferirlo por valor o déjelo sin paréntesis para transferirlo por referencia. Para obtener más información, vea Cómo: Forzar un argumento para que pase como un valor.

Ejemplo

En el siguiente ejemplo se muestran dos procedimientos que toman una variable de matriz y operan con sus elementos. El procedimiento increase sencillamente suma una unidad a cada elemento. El procedimiento replace asigna una nueva matriz al parámetro a() y, a continuación, suma una unidad a cada elemento. La reasignación, sin embargo, no afecta a la variable de matriz subyacente al código de 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 llamada a MsgBox 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 para transferir argumentos es ByVal.

La segunda llamada a MsgBox muestra "After replace(n): 11, 21, 31, 41". Dado que n se transfiere ByVal, replace no puede modificar la variable n en el código de llamada ni asignarle una nueva matriz. Cuando replace crea la nueva instancia de la matriz k y la asigna a la variable local a, pierde la referencia a n que se transfirió en el código de llamada. Cuando cambia los miembros de a, sólo resulta afectada la matriz local k . Por consiguiente, replace no incrementa los valores de la matriz n en el código de llamada.

Compilar el código

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.

Vea también

Tareas

Cómo: Pasar argumentos a un procedimiento

Cómo: Cambiar el valor de un argumento de procedimiento

Cómo: Forzar un argumento para que pase como un 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

Pasar argumentos por posición o por nombre

Tipos de valores y tipos de referencia