Condividi tramite


Procedura: cambiare il valore di un argomento di routine

Aggiornamento: novembre 2007

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. Per ciascun argomento passato ByRef, 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 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 per il parametro che corrisponde all'argomento.

    -oppure-

    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 MsgBox viene visualizzato il seguente messaggio: "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.

Compilazione del codice

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

Per impostazione predefinita, in Visual Basic gli argomenti vengono passati per valore. Durante le attività di programmazione si consiglia comunque di includere la parola chiave ByVal o ByRef con ogni parametro dichiarato al fine di agevolare la lettura del codice.

Sicurezza

Consentire a una routine di modificare il valore sottostante a un argomento nel codice chiamante è sempre potenzialmente rischioso. Assicurarsi che la modifica di tale valore sia prevista e prepararsi a verificarne la validità prima di utilizzarlo.

Vedere anche

Attività

Procedura: passare argomenti a una routine

Procedura: impedire la modifica del valore di un argomento di una routine

Procedura: forzare il passaggio di un argomento per valore

Concetti

Routine in Visual Basic

Parametri e argomenti delle routine

Passaggio di argomenti per valore e per riferimento

Differenze tra argomenti modificabili e non modificabili

Differenze tra il passaggio di argomenti per valore e per riferimento

Passaggio di argomenti tramite posizione e tramite nome

Tipi valore e tipi riferimento