È possibile specificare che un parametro di routine è facoltativo e non è necessario fornire alcun argomento quando la routine viene chiamata. I parametri facoltativi sono indicate dal Optional
parola chiave nella definizione della procedura. È necessario attenersi alle regole che seguono:
-
È necessario che ciascun parametro facoltativo nella definizione della routine specifichi un valore predefinito.
-
È necessario che tale valore predefinito per un parametro facoltativo sia un'espressione costante.
-
Ciascun parametro che segue un parametro facoltativo nella definizione della routine deve essere anch'esso facoltativo.
Nella sintassi seguente viene illustrata una dichiarazione di routine con un parametro facoltativo:
Sub name(ByVal parameter1 As datatype1, Optional ByVal parameter2 As datatype2 = defaultvalue)
Chiamata di routine con parametri facoltativi
Quando si chiama una routine con un parametro facoltativo, è possibile scegliere se fornire l'argomento o meno. Se non lo si fornisce, la routine utilizza il valore predefinito dichiarato per quel parametro.
Quando si omettono uno o più argomenti facoltativi nell'elenco degli argomenti, utilizzare virgole in sequenza per contrassegnarne la posizione. La chiamata di esempio che segue fornisce il primo e il quarto argomento, ma non il secondo o il terzo:
Sub name(argument 1, , , argument 4)
Nell'esempio riportato di seguito vengono effettuate diverse chiamate alla funzione MsgBox
che include un parametro obbligatorio e due parametri facoltativi.
Nella prima chiamata a MsgBox
vengono forniti tutti e tre gli argomenti nell'ordine in cui sono definiti da MsgBox
. Nella seconda chiamata viene fornito solo l'argomento obbligatorio. Nella terza e quarta chiamata vengono forniti il primo e il terzo argomento. Nella terza chiamata gli argomenti vengono forniti in base alla posizione, nella quarta in base al nome.
MsgBox("Important message", MsgBoxStyle.Critical, "MsgBox Example")
MsgBox("Just display this message.")
MsgBox("Test message", , "Title bar text")
MsgBox(Title:="Title bar text", Prompt:="Test message")
Determinazione dell'eventuale presenza di un argomento facoltativo
Una routine non può rilevare, in fase di esecuzione, se un determinato argomento è stato omesso o se il codice di chiamata ha fornito in modo esplicito il valore predefinito. Se è necessario fare questa distinzione, è possibile impostare come predefinito un valore improbabile. La procedura seguente definisce il parametro facoltativo office
e ne verifica il valore predefinito, QJZ
, per vedere se è stato omesso nella chiamata:
Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ")
If office = "QJZ" Then
Debug.WriteLine("office not supplied -- using Headquarters")
office = "Headquarters"
End If
' Insert code to notify headquarters or specified office.
End Sub
Se il parametro facoltativo è un tipo di riferimento come String
, è possibile utilizzare Nothing
come valore predefinito, a meno che esso non sia un valore previsto per l'argomento.
Parametri facoltativi e overload
Un altro modo per definire una routine con parametri facoltativi consiste nell'utilizzare l'overload. Nel caso di un parametro facoltativo, è possibile definire due versioni di overload della routine, una con il parametro e l'altra senza. Questo metodo diventa più complesso con l'aumentare del numero dei parametri facoltativi, tuttavia ha il vantaggio di assicurare che il programma di chiamata fornisca tutti gli argomenti facoltativi.