Considerazioni sull'overload di routine (Visual Basic)
Quando si esegue l'overload di una routine, è necessario usare una firma diversa per ogni versione di overload. Ciò significa in genere che ogni versione deve specificare un elenco di parametri diverso. Per altre informazioni, vedere "Firma diversa" in Overload delle routine.
È possibile eseguire l'overload di una routine Function
con una routine Sub
e viceversa, purché abbiano firme diverse. Due overload non possono differire solo per il fatto che uno ha un valore restituito e l'altro no.
È possibile eseguire l'overload di una proprietà nello stesso modo in cui si esegue l'overload di una routine e con le stesse restrizioni. Tuttavia, non è possibile eseguire l'overload di una routine con una proprietà o viceversa.
Alternative alle versioni di overload
In alcuni casi sono disponibili alternative alle versioni di overload, in particolare quando la presenza di argomenti è facoltativa o il relativo numero è variabile.
Tenere presente che gli argomenti facoltativi non sono necessariamente supportati da tutti i linguaggi e le matrici di parametri sono limitate a Visual Basic. Se si sta scrivendo una routine che è probabile che venga chiamata dal codice scritto in uno dei diversi linguaggi, le versioni di overload offrono la massima flessibilità.
Overload e argomenti facoltativi
Quando il codice chiamante può facoltativamente fornire o omettere uno o più argomenti, è possibile definire più versioni di overload o usare parametri facoltativi.
Quando usare le versioni di overload
È possibile considerare la definizione di una serie di versioni di overload nei casi seguenti:
La logica del codice della routine è significativamente diversa a seconda che il codice chiamante fornisca o meno un argomento facoltativo.
Il codice della routine non può verificare in modo affidabile se il codice chiamante ha fornito un argomento facoltativo. Ciò accade, ad esempio, se non esiste un possibile candidato per un valore predefinito che il codice chiamante non possa fornire.
Quando usare i parametri facoltativi
È possibile preferire uno o più parametri facoltativi nei casi seguenti:
- L'unica azione necessaria quando il codice chiamante non fornisce un argomento facoltativo consiste nell'impostare il parametro su un valore predefinito. In questo caso, il codice della routine può essere meno complesso se si definisce una singola versione con uno o più parametri
Optional
.
Per altre informazioni, vedere Parametri facoltativi.
Overload e matrici di parametri
Quando il codice chiamante può passare un numero variabile di argomenti, è possibile definire più versioni di overload o usare una matrice di parametri.
Quando usare le versioni di overload
È possibile considerare la definizione di una serie di versioni di overload nei casi seguenti:
Si sa che il codice chiamante non passa mai più di un numero ridotto di valori alla matrice di parametri.
La logica del codice della routine è significativamente diversa a seconda del numero di valori passati dal codice chiamante.
Il codice chiamante può passare valori di tipi di dati diversi.
Quando usare una matrice di parametri
È preferibile usare un parametro ParamArray
nei casi seguenti:
Non è possibile prevedere il numero di valori che il codice chiamante può passare alla matrice di parametri e potrebbe essere un numero elevato.
La logica della routine si presta all'iterazione di tutti i valori passati dal codice chiamante, eseguendo essenzialmente le stesse operazioni su ogni valore.
Per altre informazioni, vedere Matrici di parametri.
Overload impliciti per parametri facoltativi
Una routine con un parametro Optional equivale a due routine di overload, una con il parametro facoltativo e l'altra senza. Non è possibile eseguire l'overload di una routine di questo tipo con un elenco di parametri corrispondente a una delle due. Le dichiarazioni seguenti illustrano questo concetto.
Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)
' The preceding definition is equivalent to the following two overloads.
' Overloads Sub q(ByVal b As Byte)
' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
' Therefore, the following overload is not valid because the signature is already in use.
' Overloads Sub q(ByVal c As Byte, ByVal k As Long)
' The following overload uses a different signature and is valid.
Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)
Per una routine con più di un parametro facoltativo, esiste un set di overload impliciti, a cui si arriva con una logica simile a quella dell'esempio precedente.
Overload impliciti per un parametro ParamArray
Per il compilatore, una routine con un parametro ParamArray ha un numero infinito di overload che si differenziano tra loro per ciò che il codice chiamante passa alla matrice di parametri come indicato di seguito:
Un overload per quando il codice chiamante non fornisce un argomento a
ParamArray
Un overload per quando il codice chiamante fornisce una matrice unidimensionale del tipo di elemento
ParamArray
Per ogni numero intero positivo, un overload per quando il codice chiamante fornisce tale numero di argomenti, ognuno del tipo di elemento
ParamArray
Le dichiarazioni seguenti illustrano questi overload impliciti.
Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)
' The preceding definition is equivalent to the following overloads.
' Overloads Sub p(ByVal d As Date)
' Overloads Sub p(ByVal d As Date, ByVal c() As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char)
' And so on, with an additional Char argument in each successive overload.
Non è possibile eseguire l'overload di una routine di questo tipo con un elenco di parametri che accetta una matrice unidimensionale per la matrice di parametri. È tuttavia possibile usare le firme degli altri overload impliciti. Le dichiarazioni seguenti illustrano questo concetto.
' The following overload is not valid because it takes an array for the parameter array.
' Overloads Sub p(ByVal x As Date, ByVal y() As Char)
' The following overload takes a single value for the parameter array and is valid.
Overloads Sub p(ByVal z As Date, ByVal w As Char)
Programmazione senza tipi come alternativa all'overload
Se si vuole consentire al codice chiamante di passare tipi di dati diversi a un parametro, un approccio alternativo è la programmazione senza tipi. È possibile impostare l'opzione di controllo del tipo su Off
con l'istruzione Option Strict o l'opzione del compilatore -optionstrict. Non è quindi necessario dichiarare il tipo di dati del parametro. Tuttavia, questo approccio presenta gli svantaggi seguenti rispetto all'overload:
La programmazione senza tipi produce un codice di esecuzione meno efficiente.
La routine deve verificare ogni tipo di dati che prevede di passare.
Il compilatore non può segnalare un errore se il codice chiamante passa un tipo di dati non supportato dalla routine.
Vedi anche
- Procedure
- Parametri e argomenti delle routine
- Risoluzione dei problemi relativi alle routine
- Procedura: Definire più versioni di una routine
- Procedura: Chiamare una routine di overload
- Procedura: Eseguire l'overload di una routine che accetta parametri facoltativi
- Procedura: Eseguire l'overload di una routine che accetta un numero indefinito di parametri
- Overload Resolution
- Overloads