Quando passi un argomento di tipo Reference ad una funzione, se il passaggio avviene ByVal, se ne crea una copia (e quindi il parametro usato nel corpo è un'istanza diversa dal parametro attuale passato); se il passaggio avviene ByRef, passi alla funzione l'indirizzo dellì'istanza e quindi la puoi modificare permanentemente.
codice:
Module Module1
Sub Fu(ByVal P As Person)
P = New Person("Tizio", "Caio", Date.Parse("18/07/1980"))
End Sub
Sub Main()
Dim P As New Person("Pinco", "Pallino", Date.Parse("17/6/1987"))
Fu(P)
Console.WriteLine(P.CompleteName)
Console.ReadKey()
End Sub
End Module
La scritta a schermo dirà "Pinco Pallino".
Se cambi il passaggio a ByRef, la scrittà sarà "Tizio Caio".
Ci sono dei casi particolari, però, in cui dei tipi Reference vengono passati per indirizzo anche se il parametro è esplicitamente dichiarato ByVal. E' il caso dei controlli windows form:
codice:
Module Module2
Sub Fu(ByVal P As Windows.Forms.Button)
P.Name = "Button2"
End Sub
Sub Main()
Dim P As New Windows.Forms.Button
P.Name = "Button1"
Fu(P)
Console.WriteLine(P.Name)
Console.ReadKey()
End Sub
End Module
In questo caso, la scrittà dirà "Button2", anche se P viene passata per valore.