Pasar argumentos por valor y por referencia (Visual Basic)Passing Arguments by Value and by Reference (Visual Basic)

En Visual Basic, puede pasar un argumento a un procedimiento por valor o por referencia.In Visual Basic, you can pass an argument to a procedure by value or by reference. Esto se conoce como el mecanismo para pasar, y determina si el procedimiento puede modificar el elemento de programación subyacente del argumento en el código de llamada.This is known as the passing mechanism, and it determines whether the procedure can modify the programming element underlying the argument in the calling code. La declaración de procedimiento determina el mecanismo de paso para cada parámetro especificando el ByVal o ByRef palabra clave.The procedure declaration determines the passing mechanism for each parameter by specifying the ByVal or ByRef keyword.

DiferenciasDistinctions

Cuando se pasa un argumento a un procedimiento, tenga en distintas condiciones que interactúan entre sí:When passing an argument to a procedure, be aware of several different distinctions that interact with each other:

  • Si el elemento de programación subyacente es modificable o no modificableWhether the underlying programming element is modifiable or nonmodifiable

  • Si el propio argumento es modificable o no modificableWhether the argument itself is modifiable or nonmodifiable

  • Si el argumento que se ha pasado por valor o por referenciaWhether the argument is being passed by value or by reference

  • Si el tipo de datos del argumento es un tipo de valor o un tipo de referenciaWhether the argument data type is a value type or a reference type

Para obtener más información, consulte argumentos modificables y las diferencias entre modificable y las diferencias entre pasar un argumento por valor y por referencia.For more information, see Differences Between Modifiable and Nonmodifiable Arguments and Differences Between Passing an Argument By Value and By Reference.

Elección del mecanismo para pasar argumentosChoice of Passing Mechanism

Debe elegir el mecanismo de paso con cuidado para cada argumento.You should choose the passing mechanism carefully for each argument.

  • Protección.Protection. Elegir entre los mecanismos de dos paso, el criterio más importante es la exposición de una llamada a las variables a cambiar.In choosing between the two passing mechanisms, the most important criterion is the exposure of calling variables to change. La ventaja de pasar un argumento ByRef es que el procedimiento puede devolver un valor para el código que realiza la llamada a través de ese argumento.The advantage of passing an argument ByRef is that the procedure can return a value to the calling code through that argument. La ventaja de pasar un argumento ByVal es que evita que una variable que se está cambiando el procedimiento.The advantage of passing an argument ByVal is that it protects a variable from being changed by the procedure.

  • Rendimiento.Performance. Aunque el mecanismo de paso puede afectar al rendimiento del código, la diferencia es suele ser insignificante.Although the passing mechanism can affect the performance of your code, the difference is usually insignificant. Una excepción a esto es un tipo de valor pasado ByVal.One exception to this is a value type passed ByVal. En este caso, Visual Basic copia todo el contenido datos del argumento.In this case, Visual Basic copies the entire data contents of the argument. Por lo tanto, para un tipo de valor grande, como una estructura, puede ser más eficaz para pasarlo ByRef.Therefore, for a large value type such as a structure, it can be more efficient to pass it ByRef.

    Tipos de referencia, sólo el puntero a los datos es copiados (cuatro bytes en plataformas de 32 bits, ocho bytes en plataformas de 64 bits).For reference types, only the pointer to the data is copied (four bytes on 32-bit platforms, eight bytes on 64-bit platforms). Por lo tanto, puede pasar argumentos de tipo String o Object por valor sin perjudicar al rendimiento.Therefore, you can pass arguments of type String or Object by value without harming performance.

Determinación del mecanismo de pasoDetermination of the Passing Mechanism

La declaración de procedimiento especifica el mecanismo de paso para cada parámetro.The procedure declaration specifies the passing mechanism for each parameter. El código de llamada no se puede invalidar un ByVal mecanismo.The calling code can't override a ByVal mechanism.

Si se declara un parámetro con ByRef, el código de llamada puede forzar el mecanismo para ByVal , incluya el nombre del argumento entre paréntesis en la llamada.If a parameter is declared with ByRef, the calling code can force the mechanism to ByVal by enclosing the argument name in parentheses in the call. Para obtener más información, vea Cómo: Forzar un argumento para pasar por valor.For more information, see How to: Force an Argument to Be Passed by Value.

El valor predeterminado en Visual Basic consiste en pasar argumentos por valor.The default in Visual Basic is to pass arguments by value.

Cuándo se debe pasar un argumento por valorWhen to Pass an Argument by Value

  • Si el elemento de código que realiza la llamada subyacente del argumento es un elemento no modificable, declare el parámetro correspondiente ByVal.If the calling code element underlying the argument is a nonmodifiable element, declare the corresponding parameter ByVal. Ningún código puede cambiar el valor de un elemento no modificable.No code can change the value of a nonmodifiable element.

  • Si el elemento subyacente es modificable, pero no desea que el procedimiento para que pueda cambiar su valor, declare el parámetro ByVal.If the underlying element is modifiable, but you do not want the procedure to be able to change its value, declare the parameter ByVal. Solo el código de llamada puede cambiar el valor de un elemento modificable que se pasan por valor.Only the calling code can change the value of a modifiable element passed by value.

Cuándo se debe pasar un argumento por referenciaWhen to Pass an Argument by Reference

  • Si el procedimiento tiene necesidad de cambiar el elemento subyacente en el código que realiza la llamada original, declare el parámetro correspondiente ByRef.If the procedure has a genuine need to change the underlying element in the calling code, declare the corresponding parameter ByRef.

  • Si depende de la correcta ejecución del código en el procedimiento cambia el elemento subyacente en el código de llamada, declare el parámetro ByRef.If the correct execution of the code depends on the procedure changing the underlying element in the calling code, declare the parameter ByRef. Si se pasa por valor, o si el código de llamada reemplaza el ByRef mecanismo que pasa, incluya el argumento entre paréntesis, la llamada a procedimiento podría producir resultados inesperados.If you pass it by value, or if the calling code overrides the ByRef passing mechanism by enclosing the argument in parentheses, the procedure call might produce unexpected results.

EjemploExample

DescripciónDescription

El ejemplo siguiente muestra cuándo se debe pasar argumentos por valor y cuándo se debe pasar por referencia.The following example illustrates when to pass arguments by value and when to pass them by reference. Procedimiento Calculate tiene tanto un ByVal y un ByRef parámetro.Procedure Calculate has both a ByVal and a ByRef parameter. Dada una tasa de interés, ratey una cantidad de dinero, debt, la tarea del procedimiento consiste en calcular un nuevo valor para debt que es el resultado de aplicar la tasa de interés para el valor original de debt.Given an interest rate, rate, and a sum of money, debt, the task of the procedure is to calculate a new value for debt that is the result of applying the interest rate to the original value of debt. Dado que debt es un ByRef parámetro, el nuevo total se refleja en el valor del argumento en el código de llamada que se corresponde con debt.Because debt is a ByRef parameter, the new total is reflected in the value of the argument in the calling code that corresponds to debt. Parámetro rate es un ByVal parámetro porque Calculate no debe cambiar su valor.Parameter rate is a ByVal parameter because Calculate should not change its value.

CódigoCode

Module Module1

    Sub Main()
        ' Two interest rates are declared, one a constant and one a 
        ' variable.
        Const highRate As Double = 12.5
        Dim lowRate = highRate * 0.6

        Dim initialDebt = 4999.99
        ' Make a copy of the original value of the debt.
        Dim debtWithInterest = initialDebt

        ' Calculate the total debt with the high interest rate applied.
        ' Argument highRate is a constant, which is appropriate for a 
        ' ByVal parameter. Argument debtWithInterest must be a variable
        ' because the procedure will change its value to the calculated
        ' total with interest applied.
        Calculate(highRate, debtWithInterest)
        ' Format the result to represent currency, and display it.
        Dim debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with high interest: " & debtString)

        ' Repeat the process with lowRate. Argument lowRate is not a 
        ' constant, but the ByVal parameter protects it from accidental
        ' or intentional change by the procedure. 

        ' Set debtWithInterest back to the original value.
        debtWithInterest = initialDebt
        Calculate(lowRate, debtWithInterest)
        debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with low interest:  " & debtString)
    End Sub

    ' Parameter rate is a ByVal parameter because the procedure should
    ' not change the value of the corresponding argument in the 
    ' calling code. 

    ' The calculated value of the debt parameter, however, should be
    ' reflected in the value of the corresponding argument in the 
    ' calling code. Therefore, it must be declared ByRef. 
    Sub Calculate(ByVal rate As Double, ByRef debt As Double)
        debt = debt + (debt * rate / 100)
    End Sub

End Module

Vea tambiénSee also