Condividi tramite


Procedura: Proteggere un argomento di procedura dalle variazioni di valore (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 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 alocale , 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