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

Quando si chiama una routine, ogni argomento fornito corrisponde a uno dei parametri definiti nella routine. In alcuni casi, il codice della routine può modificare il valore sottostante un argomento nel codice chiamante. In altri casi, la routine può modificare solo la copia locale di un argomento.

Quando si chiama la routine, Visual Basic esegue una copia locale di ogni argomento passato ByVal. Per ogni argomento passato ByRef, Visual Basic fornisce al codice della routine un riferimento diretto all'elemento di programmazione sottostante l'argomento nel codice chiamante.

Se l'elemento sottostante nel codice chiamante è un elemento modificabile e l'argomento viene passato ByRef, il codice della routine può usare il riferimento diretto per modificare il valore dell'elemento nel codice chiamante.

Modifica del valore sottostante

Per modificare il valore sottostante di un argomento di routine nel codice chiamante

  1. Nella dichiarazione della routine specificare ByRef per il parametro corrispondente all'argomento.

  2. Nel codice chiamante passare un elemento di programmazione modificabile come argomento.

  3. Nel codice chiamante non racchiudere l'argomento tra parentesi nell'elenco di argomenti.

  4. Nel codice della routine usare il nome del parametro per assegnare un valore all'elemento sottostante nel codice chiamante.

Per una dimostrazione, vedere l'esempio più avanti.

Modifica delle copie locali

Se l'elemento sottostante nel codice chiamante è un elemento non modificabile o se l'argomento viene passato ByVal, la routine non può modificarne il valore nel codice chiamante. Tuttavia, la routine può modificare la copia locale di tale argomento.

Per modificare la copia di un argomento di routine nel codice della routine

  1. Nella dichiarazione della routine specificare ByVal per il parametro corrispondente all'argomento.

    oppure

    Nel codice chiamante racchiudere l'argomento tra parentesi nell'elenco di argomenti. In questo modo Visual Basic passerà l'argomento per valore, anche se il parametro corrispondente specifica ByRef.

  2. Nel codice della routine usare il nome del parametro per assegnare un valore alla copia locale dell'argomento. Il valore sottostante nel codice chiamante non viene modificato.

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.

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(ByRef 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, replace può modificare i relativi membri, anche se il meccanismo di passaggio è ByVal.

La seconda chiamata MsgBox visualizza "After replace(n): 101, 201, 301". Poiché n viene passato ByRef, replace può modificare la variabile n nel codice chiamante e assegnarvi una nuova matrice. Poiché n è un tipo riferimento, replace può anche modificare i relativi membri.

È possibile impedire alla routine di modificare la variabile stessa nel codice chiamante. Vedere Procedura: impedire la modifica del valore di un argomento di una routine.

Compilare il codice

Quando si passa una variabile per riferimento, è necessario usare la parola chiave ByRef per specificare questo meccanismo.

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.

Sicurezza di .NET Framework

Esiste sempre un rischio potenziale nel consentire a una routine di modificare il valore sottostante un argomento nel codice chiamante. Assicurarsi di aspettarsi che questo valore venga modificato e di essere pronti a verificarne la validità prima di usarlo.

Vedi anche