Compartir a través de


Pasar argumentos por valor y por referencia

Actualización: noviembre 2007

En Visual Basic, puede transferir un argumento a un procedimiento por valor o por referencia. Esto se conoce como mecanismo para pasar argumentos, y determina si el procedimiento puede modificar el elemento de programación subyacente al argumento en el código de llamada. La declaración del procedimiento determina el mecanismo para pasar argumentos de cada parámetro mediante la palabra clave ByVal o ByRef.

Distinciones

Al pasar un argumento a un procedimiento, tenga en cuenta las distintas condiciones que interactúan entre sí:

  • Si el elemento de programación subyacente es modificable o no modificable

  • Si el propio argumento es modificable o no modificable

  • Si el argumento se transfiere por valor o por referencia

  • Si el tipo de datos del argumento es un tipo de valor o un tipo de referencia

Para obtener más información, vea Diferencias entre argumentos modificables y no modificables y Diferencias entre pasar un argumento por valor y por referencia.

Selección del mecanismo para pasar argumentos

Debe seleccionar minuciosamente el mecanismo para pasar argumentos de cada argumento.

  • Protección. A la hora de elegir uno de los dos mecanismos que existen para pasar argumentos, el criterio más importante que hay que tener en cuenta es la exposición al cambio de las variables de llamada. La ventaja de pasar un argumento con ByRef es que el procedimiento puede devolver un valor al código de llamada por medio del argumento. La ventaja de pasarlo con ByVal es que protege a la variable de los cambios que sobre ella pueda efectuar el procedimiento.

  • Rendimiento. Aunque el mecanismo que se utilice para pasar argumentos también puede afectar al rendimiento del código, la diferencia suele ser insignificante. Existe una excepción: cuando se pasa un tipo de valor con ByVal. En esta caso, Visual Basic copia todo el contenido de los datos del argumento. Por lo tanto, para un tipo de valor grande, como una estructura, lo más eficiente es transferirlo ByRef.

    En los tipos de referencia, sólo se copia el puntero de los datos (cuatro bytes en plataformas de 32 bits y ocho bytes en plataformas de 64 bits). Por lo tanto, se pueden pasar argumentos de tipo String u Object por valor sin que esto afecte negativamente al rendimiento.

Determinación del mecanismo para pasar argumentos

La declaración del procedimiento especifica el mecanismo para pasar argumentos de cada parámetro. El código de llamada no puede reemplazar a un mecanismo ByVal, pero si un argumento se declara con ByRef, el código de llamada puede forzar al mecanismo para que pase el argumento ByVal; para ello hay que encerrar el nombre del argumento entre paréntesis en la llamada.

En Visual Basic, los argumentos se pasan por valor de forma predeterminada. Puede hacer que al código sea más fácil de leer utilizando la palabra clave ByVal. Es un hábito de programación recomendado incluir la palabra clave ByVal o ByRef con cada parámetro declarado.

Cuándo pasar un argumento por valor

  • Si el elemento del código de llamada subyacente al argumento es un elemento no modificable, declare el parámetro correspondiente ByVal. Ningún código puede cambiar el valor de un elemento no modificable.

  • Si el elemento subyacente es modificable, pero no desea que el procedimiento pueda modificar su valor, declare el parámetro ByVal. Sólo el código de llamada puede cambiar el valor de un elemento modificable transferido por valor.

Cuándo pasar un argumento por referencia

  • Si el procedimiento necesita realmente modificar el valor subyacente en el código de llamada, declare el parámetro correspondiente ByRef.

  • Si la ejecución correcta del código depende del procedimiento que cambia el elemento subyacente en el código de llamada, declare el parámetro ByRef. Si lo transfiere por valor o si el código de llamada en lugar de utilizar el mecanismo para pasar argumentos ByRef incluye el argumento entre paréntesis, la llamada al procedimiento podría producir resultados inesperados.

Vea también

Tareas

Cómo: Pasar argumentos a un procedimiento

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

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

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 posición o por nombre

Tipos de valores y tipos de referencia