Condividi tramite


Procedura: forzare il passaggio di un argomento per valore (Visual Basic)

La dichiarazione di routine determina il meccanismo di passaggio. Se un parametro viene dichiarato ByRef (Visual Basic), 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 (Visual Basic) 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 Visual Basic, 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 (Visual Basic) o ByRef (Visual Basic) con ogni parametro dichiarato, al fine di agevolare la lettura del codice.

Programmazione efficiente

Se una routine dichiara un parametro ByRef (Visual Basic), 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 (Visual Basic)

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

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

Altre risorse

Implementazione del tipo di dati (Visual Basic)