ByVal toma el valor del objeto o variable que envías al método y luego trabaja con ese valor. Dejando el objeto original sin modificar.
ByRef crea una referencia del objeto o la variable. Los cambios que hagas con ella dentro del Sub se verán reflejados incluso fuera del método a donde la enviaste.
Puedes correr el siguiente código para que entiendas mejor como funciona
Sub Usando_ByRef(ByRef x As Integer)
x = x * 2
MsgBox("X vale " & x & " Dentro del Sub Usando_ByRef")
End Sub
Sub Usando_ByVal(ByVal x As Integer)
x = x * 2
MsgBox("X vale " & x & " Dentro del Sub Usando_ByVal")
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Mi_Variale As Integer = 10
MsgBox("Mi Variable vale " & Mi_Variale & " Al momento de crearla")
'Envio usando ByVal
Usando_ByVal(Mi_Variale)
MsgBox("Mi Variable vale " & Mi_Variale & " Cuando retorno del sub luego de enviarla ByVal. Es decir no ha cambiado")
'envío usando ByRef
Usando_ByRef(Mi_Variale)
MsgBox("Mi Variable vale " & Mi_Variale & " Cuando retorno del sub luego de enviarla ByRef. Es decir ha cambiado su valor")
End Sub
Cuando envío Mi_Variable
- que vale 10 - a un Sub vía ByVal
este valor es recibido, nombrado X
y luego multiplicado por 2.
Dentro del Sub X
vale ahora 20. Cuando retorno al Form_load
sin embargo, Mi_Variable
sigue valiendo 10.
El otro caso es enviar Mi_Variable
vía ByVal
aquí la variable es referenciada y se le asigna el nombre X
para trabajar dentro del Sub, e igualmente multiplicado por 2.
X
luego de ejecutarse el Sub vale ahora 20 y el gran cambio es que al retornar al Form_load
Mi_Variable
también vale 20 (es decir el valor de X
)
Si esta respuesta te ayudo, no te olvides de marcarla como correcta 