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.
La scritta a schermo dirà "Pinco Pallino".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
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:
In questo caso, la scrittà dirà "Button2", anche se P viene passata per valore.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

Rispondi quotando