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
- Procedimientos
- Argumentos y parámetros de procedimiento
- Procedimiento para pasar argumentos a un procedimiento
- Pasar argumentos por valor y por referencia
- Diferencias entre argumentos modificables y no modificables
- Diferencias entre pasar un argumento por valor y por referencia
- Procedimiento para cambiar el valor de un argumento de procedimiento
- Procedimiento para proteger un argumento de procedimiento para que no se realicen cambios de valor
- Paso de argumentos por posición o por nombre
- Value Types and Reference Types