Share via


Procedura: impedire la modifica del valore di un argomento di una routine

Aggiornamento: novembre 2007

Se una routine dichiara un parametro come ByRef, Visual Basic assegna al codice della routine un riferimento diretto all'elemento di programmazione sottostante all'argomento nel codice chiamante. In questo modo, la routine può modificare il valore sottostante all'argomento nel codice chiamante. In alcuni casi è necessario proteggere il codice da questo tipo di modifica.

Per proteggere sempre un argomento da eventuali modifiche, è possibile dichiarare il parametro ByVal corrispondente nella routine. Per consentire la modifica di un determinato argomento in alcuni casi e non in altri, è possibile dichiararlo ByRef e lasciare che il codice chiamante determini il meccanismo di passaggio in ogni chiamata. A tale scopo l'argomento corrispondente viene racchiuso o meno tra parentesi a seconda che debba essere passato per valore o per riferimento. Per ulteriori informazioni, vedere Procedura: forzare il passaggio di un argomento per valore.

Esempio

Nell'esempio riportato di seguito 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(), quindi aggiunge uno a ogni elemento. Tuttavia, la riassegnazione non ha effetto sulla variabile di matrice del 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)))

Alla prima chiamata di MsgBox viene visualizzato "After increase(n): 11, 21, 31, 41". Poiché la matrice n è un tipo di riferimento, la routine replace può modificarne i membri, anche se il meccanismo di passaggio è ByVal.

Alla seconda chiamata di MsgBox viene visualizzato "After replace(n): 11, 21, 31, 41". Poiché n viene passata ByVal, la routine replace non può modificare la variabile n nel codice chiamante assegnandole una nuova matrice. Quando replace crea la nuova istanza di matrice k e la assegna alla variabile locale a, perde il riferimento alla variabile n passata dal codice chiamante. Quando la routine in questione modifica i membri di a, la modifica ha effetto solo sulla matrice locale k . Pertanto, replace non incrementa i valori della matrice n nel codice chiamante.

Compilazione del codice

Il meccanismo di passaggio degli argomenti predefinito in Visual Basic è per valore. È comunque buona norma di programmazione includere la parola chiave ByVal o ByRef con ogni parametro dichiarato, al fine di agevolare la lettura del codice.

Vedere anche

Attività

Procedura: passare argomenti a una routine

Procedura: cambiare il valore di un argomento di routine

Procedura: forzare il passaggio di un argomento per valore

Concetti

Routine in Visual Basic

Parametri e argomenti delle routine

Passaggio di argomenti per valore e per riferimento

Differenze tra argomenti modificabili e non modificabili

Differenze tra il passaggio di argomenti per valore e per riferimento

Passaggio di argomenti tramite posizione e tramite nome

Tipi valore e tipi riferimento