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

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

Al llamar al procedimiento, Visual Basic realiza una copia local de cada argumento que se pasa a ByVal. Para cada argumento pasado 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.

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

  1. En la declaración de procedimiento, especifica ByRef para el parámetro correspondiente al argumento.

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

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

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

Consulta el ejemplo más abajo para ver una demostración.

Cambiar copias locales

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

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

  1. En la declaración de procedimiento, especifica ByVal para el parámetro correspondiente al argumento.

    O bien

    En el código de llamada, incluye el argumento entre paréntesis en la lista de argumentos. Esto obliga a Visual Basic a pasar el argumento por valor, incluso si el parámetro correspondiente especifica ByRef.

  2. En el código del procedimiento, use el nombre del parámetro para asignar un valor a la copia local del argumento. No se cambia el valor subyacente en el código de llamada.

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.

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 MsgBox llamada 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 de paso sea ByVal.

La segunda MsgBox llamada muestra «After replace(n): 101, 201, 301». Dado que n se pasa ByRef, replace no se puede modificar la variable n en el código de llamada mediante la asignación de una nueva matriz a ella. Dado que n es un tipo de referencia, replace también puedes cambiar sus miembros.

Puedes impedir que el procedimiento modifique la propia variable en el código de llamada. Consulta Cómo: Proteger un argumento de procedimiento para que no se realicen cambios de valor.

Compilar el código

Si pasas una variable por referencia, debes usar la palabra clave ByRef para especificar este mecanismo.

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.

Seguridad de .NET Framework

Siempre hay un riesgo potencial al permitir que un procedimiento cambie el valor subyacente de un argumento en el código de llamada. Asegúrate de que esperas que se cambie este valor y estate preparado para comprobar su validez antes de usarlo.

Consulte también