Procedura: impedire la modifica del valore di un argomento di una routine (Visual Basic)

Se una routine dichiara un parametro come ByRef (Visual Basic), 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 (Visual Basic) 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 (Visual Basic).

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 (Visual Basic) o ByRef (Visual Basic) con ogni parametro dichiarato, al fine di agevolare la lettura del codice.

Vedere anche

Attività

Procedura: passare argomenti a una routine (Visual Basic)

Procedura: cambiare il valore di un argomento di routine (Visual Basic)

Procedura: forzare il passaggio di un argomento per valore (Visual Basic)

Concetti

Routine in Visual Basic

Parametri e argomenti delle routine (Visual Basic)

Passaggio di argomenti per valore e per riferimento (Visual Basic)

Differenze tra argomenti modificabili e non modificabili (Visual Basic)

Differenze tra il passaggio di un argomento per valore e per riferimento (Visual Basic)

Passaggio di argomenti in base alla posizione e al nome (Visual Basic)

Altre risorse

Implementazione del tipo di dati (Visual Basic)