Condividi tramite


Meccanismo di passaggio dei parametri per gli utenti di Visual Basic 6.0

Aggiornamento: novembre 2007

In Visual Basic 2008 sono state introdotte numerose modifiche che influiscono sul modo in cui gli argomenti sono passati alle routine.

Meccanismo di passaggio predefinito

Visual Basic 6.0

In Visual Basic 6.0 se non si specifica ByVal o ByRef per un parametro di routine, l'impostazione predefinita del meccanismo di passaggio sarà mediante ByRef. La variabile passata alla routine potrà quindi essere modificata nel programma chiamante.

L'esposizione a modifiche di una variabile può creare problemi. Nell'esempio riportato di seguito l'impostazione predefinita del meccanismo di passaggio è mediante ByRef, il valore di elapsedSeconds viene modificato da minutesPastHour e elapsedSeconds non viene visualizzato correttamente da MsgBox.

Function minutesPastHour(seconds As Integer) As Integer 
    Dim hours As Integer = seconds \ 3600 
    seconds = seconds Mod 3600 
    Return seconds \ 60 
End Function 
Sub showSecondsAndMinutes() 
    Dim elapsedSeconds, extraMinutes As Integer 
    elapsedSeconds = CInt(Timer()) ' Integer seconds since midnight. 
    extraMinutes = minutesPastHour(elapsedSeconds) 
    MsgBox "Total seconds: " & elapsedSeconds & _ 
        "; minutes past hour: " & extraMinutes 
End Sub 

Il passaggio di un argomento utilizzando ByRef consente a una routine di modificarlo nel programma chiamante. Tuttavia, questo potrebbe provocare un comportamento non previsto. Se tale routine chiama un'altra routine e passa lo stesso argomento utilizzando ByRef, i rischi che la variabile originale possa essere modificata in modo non intenzionale sono maggiori.

Visual Basic 2008

Quando si dichiara una routine in Visual Basic 2008, l'impostazione predefinita del meccanismo di passaggio è tramiteByVal per tutti i parametri. In questo modo gli argomenti sono protetti da eventuali modifiche. È possibile riscrivere la dichiarazione dell'esempio precedente nel modo riportato di seguito.

Function MinutesPastHour(ByVal Seconds As Integer) As Integer

Il passaggio di seconds per valore impedisce alla routine di accedere alla variabile nel programma chiamante e aiuta a evitare il problema appena descritto.

Anche se ByVal è il meccanismo predefinito, specificandolo in modo esplicito per ogni parametro è possibile eliminare qualsiasi incertezza e facilitare la lettura del codice.

Argomenti della proprietà ByRef

Visual Basic 6.0

In Visual Basic 6.0 una proprietà passata a una routine come argomento ByRef viene copiata nella routine ma non dalla routine. Eventuali modifiche apportate a tale proprietà quindi non vengono riflesse sulla proprietà originale nel programma chiamante, anche se è stata passata utilizzando ByRef.

Visual Basic 2008

In Visual Basic 2008, un argomento di proprietà passato tramite ByRef viene copiato sia nella routine che dalla routine. Nell'esempio seguente viene illustrato come è possibile che una routine modifichi una proprietà.

Sub Reduce(ByRef Height As Single)
' ... ... ... ... ... ... ...  ' Code to modify Height argument. 
End Sub
Dim Sq As Square = New Square  ' Square has property Side of type Single. 
Reduce(Sq.Side)                ' Side is changed when Reduce returns. 

Quando una routine modifica un argomento delle proprietà, il valore della proprietà originale non viene modificato immediatamente nel programma chiamante, ma viene copiato dalla routine al ritorno della routine stessa.

Argomenti ParamArray

Visual Basic 6.0

In Visual Basic 6.0 una routine può specificare la parola chiave ParamArray nell'ultimo degli argomenti per accettare una matrice di argomenti Variant. Non è possibile dichiarare il meccanismo di passaggio di tali argomenti, che vengono sempre passati utilizzando ByRef.

Visual Basic 2008

In Visual Basic 2008, gli argomenti ParamArray sono sempre passati tramite ByVal. È necessario che il tipo di dati degli argomenti della matrice corrisponda al tipo di dati dell'argomento ParamArray.

Vedere anche

Concetti

Dichiarazione di routine per gli utenti di Visual Basic 6.0

Sequenza di chiamata delle routine per gli utenti di Visual Basic 6.0

Matrici di parametri

Riepilogo delle modifiche al supporto degli elementi di programmazione

Riferimenti

Istruzione Function (Visual Basic)

Istruzione Sub (Visual Basic)

ByVal

ByRef

ParamArray