Share via


Procedura: forzare il passaggio di un argomento per valore

Aggiornamento: novembre 2007

La dichiarazione di routine determina il meccanismo di passaggio. Se un parametro viene dichiarato ByRef, in Visual Basic si prevede che l'argomento corrispondente venga passato per riferimento. In questo modo la routine può modificare il valore dell'elemento di programmazione sottostante all'argomento nel codice chiamante. Se si desidera proteggere l'elemento sottostante da tale modifica, è possibile eseguire l'override del meccanismo di passaggio ByRef nella chiamata di routine racchiudendo il nome dell'argomento tra parentesi. Tali parentesi vengono aggiunte a quelle che racchiudono l'elenco di argomenti nella chiamata.

Non è possibile eseguire l'override di un meccanismo ByVal mediante il codice chiamante.

Per imporre il passaggio di un argomento per valore

  • Se il parametro corrispondente viene dichiarato ByVal nella routine, non è necessario eseguire operazioni aggiuntive, in quanto è già previsto che l'argomento venga passato per valore.

  • Se il parametro corrispondente viene dichiarato ByRef nella routine, racchiudere l'argomento tra parentesi nella chiamata di routine.

Esempio

Nell'esempio riportato di seguito viene eseguito l'override di una dichiarazione di parametro ByRef. Si osservino i due livelli di parentesi nella chiamata che impone ByVal.

Sub setNewString(ByRef inString As String)
    inString = "This is a new value for the inString argument."
    MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"

' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)

' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)

Quando str è racchiuso tra parentesi aggiuntive all'interno dell'elenco di argomenti, non è possibile modificare il valore della routine setNewString nel codice chiamante e in MsgBox viene visualizzato il messaggio "Cannot be replaced if passed ByVal". Quando il valore str non è racchiuso tra parentesi aggiuntive, la routine può modificarlo e in MsgBox viene visualizzato il messaggio "This is a new value for the inString argument."

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. In fase di programmazione è tuttavia consigliabile includere la parola chiave ByVal o ByRef con ogni parametro dichiarato, al fine di agevolare la lettura del codice.

Programmazione efficiente

Se una routine dichiara un parametro ByRef, la corretta esecuzione del codice potrebbe dipendere dalla possibilità o meno di modificare l'elemento sottostante nel codice chiamante. Se il codice chiamante esegue l'override di questo meccanismo di chiamata racchiudendo l'argomento tra parentesi o se passa un argomento non modificabile, non sarà possibile modificare l'elemento sottostante mediante la routine. Ciò potrebbe generare risultati imprevisti nel codice chiamante.

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

Procedura: cambiare il valore di un argomento di routine

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

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