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

La declaración de procedimiento determina el mecanismo de paso. Si un parámetro se declara como ByRef, Visual Basic espera pasar el argumento correspondiente por referencia. Esto permite al procedimiento cambiar el valor del elemento de programación que subyace al argumento en el código de llamada. Si desea proteger el elemento subyacente frente a este cambio, puede invalidar el mecanismo de paso ByRef en la llamada al procedimiento mediante la inclusión del nombre del argumento entre paréntesis. Estos paréntesis se agregan a los paréntesis que incluyen la lista de argumentos en la llamada.

El código de llamada no puede invalidar un mecanismo ByVal.

Para forzar un argumento para que pase como un valor

  • Si el parámetro correspondiente se declara ByVal en el procedimiento, no es necesario realizar ningún paso adicional. Visual Basic ya espera pasar el argumento como valor.

  • Si el parámetro correspondiente se declara ByRef en el procedimiento, incluya el argumento entre paréntesis en la llamada al procedimiento.

Ejemplo

En el ejemplo siguiente se invalida una declaración de parámetro ByRef. En la llamada que fuerza ByVal, observe los dos niveles de paréntesis.

Sub setNewString(ByRef inString As String)
    inString = "This is a new value for the inString argument."
    MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"

' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)

' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)

Cuando se incluye str entre paréntesis adicionales dentro de la lista de argumentos, el procedimiento setNewString no puede cambiar su valor en el código de llamada y MsgBox muestra "No se puede reemplazar si se pasa ByVal". Si str no se incluye entre paréntesis adicionales, el procedimiento puede cambiarlo y MsgBox muestra "Se trata de un nuevo valor para el argumento inString".

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.

Programación sólida

Si un procedimiento declara un parámetro ByRef, la ejecución correcta del código puede depender de poder cambiar el elemento subyacente en el código que realiza la llamada. Si el código de llamada invalida este mecanismo de llamada mediante la inclusión del argumento entre paréntesis o si pasa un argumento no modificable, el procedimiento no podrá cambiar el elemento subyacente. Esto podría producir resultados inesperados en el código de llamada.

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