Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 procedura di modificare il valore associato all'argomento nel codice della chiamata. In alcuni casi il codice chiamante potrebbe voler proteggere da tale modifica.
È sempre possibile proteggere un argomento dalla modifica dichiarando il parametro corrispondente ByVal nella procedura. 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. Lo fa racchiudendo l'argomento corrispondente tra parentesi per passarlo per valore, oppure 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 procedure che accettano una variabile di matrice e operano sui relativi elementi. La increase
routine aggiunge semplicemente uno a ogni elemento. La replace
procedura assegna una nuova matrice al parametro a()
e quindi ne aggiunge uno a ogni elemento. Tuttavia, la riassegnazione non influisce 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 MsgBox
chiamata visualizza "Dopo l'aumento(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 MsgBox
chiamata visualizza "Dopo la sostituzione(n): 11, 21, 31, 41". Poiché n
viene passato ByVal
, replace
non è possibile modificare la variabile n
nel codice chiamante assegnando una nuova matrice. Quando replace
crea la nuova istanza k
della matrice e la assegna alla variabile a
locale , perde il riferimento a n
passato dal codice chiamante. Quando cambia i membri di a
, è interessata solo la matrice k
locale. Pertanto, replace
non incrementa i valori della matrice n
nel codice chiamante.
Compilare il codice
La modalità predefinita in Visual Basic è passare gli 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.
Vedere anche
- Procedure
- Parametri e argomenti della procedura
- Come: Passare argomenti a una procedura
- 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: Modificare il valore di un argomento di procedura
- Procedura: Forzare il passaggio di un argomento in base al valore
- Passaggio di argomenti per posizione e per nome
- Tipi Valore e Tipi di Riferimento