Condividi tramite


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

Quando viene effettuata una chiamata a una routine, ciascun argomento specificato corrisponde a uno dei parametri definiti nella routine. In alcuni casi, il codice della routine può modificare il valore sottostante a un argomento nel codice chiamante. In altri, la routine può modificare solo la relativa copia locale di un argomento.

Quando si effettua una chiamata alla routine, in Visual Basic viene creata una copia locale di ogni argomento passato ByVal (Visual Basic). Per ciascun argomento passato ByRef (Visual Basic), Visual Basic assegna al codice della routine un riferimento diretto all'elemento di programmazione sottostante all'argomento nel codice chiamante.

Se tale elemento sottostante è modificabile e l'argomento viene passato ByRef, il codice della routine può utilizzare 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 (Visual Basic) per il parametro che corrisponde 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 degli argomenti.

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

Per una dimostrazione, vedere l'esempio riportato di seguito.

Modifica delle copie locali

Se l'elemento sottostante nel codice chiamante non è modificabile o se l'argomento viene passato ByVal, la routine non può modificare il relativo valore nel codice chiamante. Può invece modificare la relativa copia locale di questo tipo di argomento.

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

  1. Nella dichiarazione della routine specificare ByVal (Visual Basic) per il parametro che corrisponde all'argomento.

    In alternativa

    Nel codice chiamante racchiudere l'argomento tra parentesi nell'elenco degli argomenti. In questo modo, Visual Basic verrà forzato a passare l'argomento per valore, anche se nel parametro corrispondente è specificato ByRef.

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

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.

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)))

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 MsgBox viene visualizzato il seguente messaggio: "After replace(n): 101, 201, 301". Poiché n viene passato ByRef, la routine replace può modificare la variabile n nel codice chiamante e assegnare a quest'ultima una nuova matrice. Poiché n è un tipo di riferimento, la routine replace può anche modificarne i membri.

È possibile impedire alla routine di modificare la variabile nel codice chiamante. Per informazioni, vedere Procedura: impedire la modifica del valore di un argomento di una routine (Visual Basic).

Compilazione del codice

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

Per impostazione predefinita, in Visual Basic gli argomenti vengono passati 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.

Sicurezza

Esiste sempre un rischio potenziale quando si consente che una routine modifichi il valore sottostante un argomento nel codice chiamante. Accertarsi che la modifica del valore sia prevista e verificare la validità del valore prima di utilizzarlo.

Vedere anche

Attività

Procedura: passare argomenti a una routine (Visual Basic)

Procedura: impedire la modifica del valore di un argomento di una 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)

Tipi valore e tipi riferimento