Il modificatore ByVal indica il passaggio di un parametro a una procedura o funzione per valore. In Visual Basic ByVal è usato per impostazione predefinita e garantisce che le modifiche effettuate sul parametro all'interno della procedura non influenzino la variabile originale passata dalla parte chiamante.
Nelle versioni classiche di VB, qualsiasi parametro poteva essere passato in due modi: per valore o per riferimento. Con l'evoluzione del linguaggio e l'emergere di tipi di dati complessi (strutture, classi), è aumentata l'importanza di una scelta consapevole tra ByVal e ByRef.
Una scelta errata del modo di passaggio del parametro porta spesso a errori: si può accidentalmente modificare la variabile del codice chiamante, oppure, al contrario, si possono aspettare modifiche che non avverranno.
ByVal viene utilizzato quando la procedura deve lavorare con una copia del valore. È applicato per passare tipi primitivi, strutture, a volte anche tipi di riferimento, se è importante mantenere il riferimento.
Esempio di codice:
Sub Increment(ByVal number As Integer) number += 1 End Sub Dim myValue As Integer = 10 Increment(myValue) Console.WriteLine(myValue) ' Restituisce 10, non 11
Caratteristiche chiave:
Come si comporterà un oggetto (ad esempio, un'istanza di una classe) se viene passato con il modificatore ByVal?
Risposta: Viene passata una copia del riferimento all'oggetto, e non l'oggetto stesso. È possibile modificare i campi dell'oggetto dalla procedura - le modifiche saranno visibili dall'esterno. Solo il riferimento, e non l'oggetto, non può essere sostituito con un nuovo all'interno della procedura con effetto sul codice chiamante.
Esempio di codice:
Class Counters Public Value As Integer End Class Sub ModifyCounter(ByVal c As Counters) c.Value = 999 ' Cambia la proprietà! c = New Counters() ' Questa modifica non è visibile al codice chiamante End Sub Dim example As New Counters() ModifyCounter(example) Console.WriteLine(example.Value) ' Stampa 999
Cambia il valore della struttura quando viene passato ByVal, se i suoi campi vengono modificati all'interno della procedura?
Risposta: No, l'intera istanza della struttura viene copiata e le modifiche non pervengono all'esterno. Ogni registrazione della struttura, ad esempio, Point, all'interno della procedura è separata.
È necessario specificare esplicitamente ByVal per un parametro?
Risposta: No, ByVal è utilizzato per impostazione predefinita, la specificazione esplicita è solo per maggiore leggibilità e per seguire lo stile di codifica.
Un sviluppatore passa un array ByVal a una funzione aspettando che gli elementi possano essere aggiornati nell'array e che un nuovo array appaia dalla parte chiamante (de facto il tipo Reference viene passato per riferimento).
Pro:
Contro:
Per passare un indice array che non deve essere modificato dalla funzione, si utilizza ByVal. Anche se all'interno si modifica il valore dell'indice, la variabile originale non viene influenzata.
Pro:
Contro: