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

Cuando llama a un procedimiento, cada argumento proporcionado se corresponde con uno de los parámetros definidos en el procedimiento.En algunos casos, el código del procedimiento puede cambiar el valor subyacente a un argumento en el código de llamada.En otros casos, el procedimiento sólo puede cambiar la copia local de un argumento.

Cuando llama al procedimiento, Visual Basic hace una copia local de cada argumento transferido ByVal (Visual Basic).En cada argumento transferido 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.

Si el elemento subyacente del código de llamada es un elemento modificable y el argumento se transfiere ByRef, el código del procedimiento puede utilizar 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 del procedimiento en el código de llamada

  1. En la declaración del procedimiento, especifique ByRef (Visual Basic) en el parámetro que se corresponda con el argumento.

  2. En el código de llamada, transfiera un elemento de programación modificable como argumento.

  3. En el código de llamada, no incluya el argumento entre paréntesis en la lista de argumentos.

  4. En el código de procedimiento, utilice el nombre de parámetro para asignar un valor al elemento subyacente del código de llamada.

Vea el ejemplo siguiente para consultar una demostración.

Cambiar las copias locales

Si el elemento subyacente del código de llamada no es un elemento modificable o si el argumento se transfiere ByVal, el procedimiento no puede cambiar su valor en el código de llamada.Sin embargo, el procedimiento puede cambiar la copia local de este tipo de argumento.

Para cambiar la copia de un argumento del procedimiento en el código del procedimiento

  1. En la declaración del procedimiento, especifique ByVal (Visual Basic) en el parámetro que se corresponda con el argumento.

    O bien

    En el código de llamada, incluya el argumento entre paréntesis en la lista de argumentos.Esto hace que Visual Basic transfiera el argumento por valor, aun cuando el parámetro correspondiente especifique ByRef.

  2. En el código del procedimiento, utilice el nombre de parámetro para asignar un valor a la copia local del argumento.El valor subyacente del código de llamada no se modifica.

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.

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 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): 101, 201, 301".Dado que n se transfiere ByRef, replace puede modificar la variable n en el código de llamada y asignarle una nueva matriz.Como n es un tipo de referencia, replace también puede cambiar sus miembros.

Puede evitar que el procedimiento modifique la propia variable en el código de llamada.Vea Cómo: Proteger un argumento de procedimiento para que no se realicen cambios de valor (Visual Basic).

Compilar el código

Cuando se pasa una variable por referencia, debe utilizarse la palabra clave ByRef para especificar este mecanismo.

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.

Seguridad

Existe siempre el riesgo potencial de permitir que un procedimiento cambie el valor subyacente a un argumento en el código de llamada.Asegúrese de que tiene previsto que este valor se modifique y prepárese para comprobar su validez antes de utilizarlo.

Vea también

Tareas

Cómo: Pasar argumentos a un procedimiento (Visual Basic)

Cómo: Proteger un argumento de procedimiento para que no se realicen cambios de valor (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)

Tipos de valor y tipos de referencia