Compartir a través de


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

Si un procedimiento declara un parámetro ByRef (Visual Basic), 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 (Visual Basic) 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 (Visual Basic).

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 (Visual Basic) o ByRef (Visual Basic) 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 (Visual Basic)

Cómo: Cambiar el valor de un argumento de procedimiento (Visual Basic)

Cómo: Forzar un argumento para que pase como un valor (Visual Basic)

Conceptos

Procedimientos en Visual Basic

Argumentos y parámetros de procedimiento (Visual Basic)

Pasar argumentos por valor y por referencia (Visual Basic)

Diferencias entre argumentos modificables y no modificables (Visual Basic)

Diferencias entre pasar un argumento por valor y por referencia (Visual Basic)

Pasar argumentos por posición o por nombre (Visual Basic)

Otros recursos

Implementación de tipos de datos (Visual Basic)