Procedura: impedire la modifica del valore di un argomento di una routine (Visual Basic)
Se una routine dichiara un parametro come ByRef, Visual Basic fornisce al codice della routine un riferimento diretto all'elemento di programmazione sottostante l'argomento nel codice chiamante. Ciò consente alla routine di modificare il valore sottostante l'argomento nel codice chiamante. In alcuni casi è possibile che il codice chiamante si voglia proteggere da tale modifica.
È sempre possibile proteggere un argomento dalla modifica dichiarando il parametro ByVal corrispondente nella routine. Se si vuole essere in grado di modificare un determinato argomento in alcuni casi ma non in altri, è possibile dichiararlo ByRef
e consentire al codice chiamante di determinare il meccanismo di passaggio in ogni chiamata, racchiudendo l'argomento corrispondente tra parentesi per passarlo per valore o non racchiudendolo tra parentesi per passarlo per riferimento. Per altre informazioni, vedere Procedura: Forzare il passaggio di un argomento in base al valore.
Esempio
Nell'esempio seguente vengono illustrate due routine che accettano una variabile di matrice e operano sui relativi elementi. La routine increase
aggiunge semplicemente uno a ogni elemento. La routine replace
assegna una nuova matrice al parametro a()
e quindi aggiunge uno a ogni elemento. La riassegnazione non influisce tuttavia sulla variabile di matrice sottostante nel codice chiamante.
Public Sub increase(ByVal a() As Long)
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Public Sub replace(ByVal a() As Long)
Dim k() As Long = {100, 200, 300}
a = k
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
La prima chiamata MsgBox
visualizza "After increase(n): 11, 21, 31, 41". Poiché la matrice n
è un tipo riferimento, increase
può modificare i relativi membri, anche se il meccanismo di passaggio è ByVal
.
La seconda chiamata MsgBox
visualizza "After replace(n): 11, 21, 31, 41". Poiché n
viene passato ByVal
, replace
non può modificare la variabile n
nel codice chiamante assegnando una nuova matrice. Quando replace
crea la nuova istanza della matrice k
e la assegna alla variabile locale a
, perde il riferimento a n
passato dal codice chiamante. Quando modifica i membri di a
, è interessata solo la matrice locale k
. Pertanto, replace
non incrementa i valori della matrice n
nel codice chiamante.
Compilare il codice
L'impostazione predefinita in Visual Basic prevede il passaggio degli argomenti per valore. È tuttavia consigliabile includere la parola chiave ByVal o ByRef con ogni parametro dichiarato. In questo modo il codice risulta più semplice da leggere.
Vedi anche
- Procedure
- Parametri e argomenti delle routine
- Procedura: Passare argomenti a una routine
- Passaggio di argomenti per valore e per riferimento
- Differenze tra argomenti modificabili e non modificabili
- Differenze tra il passaggio di un argomento per valore e per riferimento
- Procedura: cambiare il valore di un argomento di routine
- Procedura: forzare il passaggio di un argomento per valore
- Passaggio di argomenti in base alla posizione e al nome
- Tipi valore e tipi di riferimento