En Visual Basic hay dos formas de pasar argumentos a procedimientos: ByVal (por valor, copia) y ByRef (por referencia, el objeto o variable misma). Si el parámetro se marca como ByRef, cualquier cambio realizado dentro del procedimiento se reflejará en la variable original fuera del procedimiento.
Usar ByRef es especialmente relevante si se necesitan devolver múltiples resultados de una función o optimizar el trabajo con grandes estructuras de datos (sin copiarlas).
Ejemplo:
Sub Swap(ByRef a As Integer, ByRef b As Integer) Dim temp As Integer = a a = b b = temp End Sub Dim x As Integer = 10 Dim y As Integer = 20 Swap(x, y) ' x = 20, y = 10
Pregunta: "¿Es seguro pasar tipos de datos simples (Integer, String) por referencia entre diferentes hilos?"
Respuesta: ¡No! Al pasar variables por referencia (ByRef) entre hilos pueden surgir condiciones de carrera (data races), ya que ambos procedimientos pueden modificar la variable en diferentes momentos. Esto no es seguro y podría resultar en errores difíciles de detectar.
Ejemplo:
' En modo multihilo, puede haber una situación en la que los valores ' a y b sean reemplazados incorrectamente debido al acceso simultáneo!
Historia:
En un viejo producto financiero se utilizaba
ByRefpara pasar contadores entre varios módulos. Uno de los desarrolladores accidentalmente pasó a la función una expresión temporal por referencia, en lugar de una variable. Esto causó un fallo en el programa, ya que una referencia inexistente intentaba modificar un objeto no inicializado.
Historia:
Un sistema de cálculo de ingeniería pasaba arreglos por referencia para ahorrar memoria. Sin embargo, alguien modificó el arreglo dentro de un procedimiento auxiliar. Esto condujo a errores difíciles de detectar: los datos cambiaban fuera del contexto esperado.
Historia:
En un analizador de datos por hilos intentaron «optimizar» el paso de cadenas por referencia para acelerar el trabajo. Debido al paso inseguro de cadenas por referencia simultáneamente desde varios hilos, aparecieron fallos impredecibles y se rompió el mecanismo de sincronización.