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