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 è dichiarato ByRef, Visual Basic prevede di passare l'argomento corrispondente per riferimento. Ciò consente alla routine di modificare il valore dell'elemento di programmazione sottostante l'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. Queste parentesi si aggiungono alle parentesi che racchiudono l'elenco di argomenti nella chiamata.

Il codice chiamante non può eseguire l'override di un meccanismo ByVal.

Per forzare il passaggio di un argomento per valore

  • Se il parametro corrispondente viene dichiarato come ByVal nella routine, non è necessario eseguire altri passaggi. Visual Basic prevede già di passare l'argomento per valore.

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

Esempio

Nell'esempio seguente viene eseguito l'override di una dichiarazione di parametro ByRef. Nella chiamata che forza ByVal, osservare i due livelli di parentesi.

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, la routine setNewString non può modificarne il valore nel codice chiamante e MsgBox visualizza un messaggio che indica che non può essere sostituito se passato come ByVal. Quando str non è racchiuso tra parentesi aggiuntive, la routine può modificarlo e MsgBox visualizza un messaggio che indica che questo è un nuovo valore per l'argomento inString.

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.

Programmazione efficiente

Se una routine dichiara un parametro ByRef, la corretta esecuzione del codice potrebbe dipendere dalla possibilità 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, la routine non può modificare l'elemento sottostante. Questo potrebbe generare risultati imprevisti nel codice chiamante.

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 prevedere che questo valore venga modificato e di essere pronti a verificarne la validità prima di usarlo.

Vedi anche