Condividi tramite


Considerazioni sull'overload di routine

Aggiornamento: novembre 2007

Quando si esegue l'overload di una routine, è necessario utilizzare una firma diversa per ciascuna versione di overload. Questo in genere significa che per ogni versione deve essere specificato un elenco di parametri distinto. Per ulteriori informazioni, vedere "Firma diversa" in Overload della routine.

È possibile eseguire l'overload di una routine Function con una routine Sub e viceversa, purché le firme siano diverse. Non è consentito che l'unica differenza tra due overload sia la presenza o meno di un valore restituito.

È possibile eseguire l'overload di una proprietà in base alla stessa procedura utilizzata per una routine e con le stesse limitazioni. Non è invece possibile eseguire l'overload di una routine con una proprietà o viceversa.

Alternative alle versioni di overload

In alcuni casi esistono alternative alle versioni di overload, specialmente 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 che le matrici di parametri sono disponibili solo in Visual Basic. Le versioni di overload offrono il massimo livello di flessibilità per la scrittura di routine destinate con ogni probabilità a essere chiamate da codice creato in uno dei numerosi linguaggi.

Overload e argomenti facoltativi

Se il codice chiamante può facoltativamente specificare oppure omettere uno o più argomenti, è possibile definire più versioni di overload o utilizzare parametri facoltativi.

Utilizzo di versioni di overload

Di seguito sono riportati i casi in cui è opportuno prendere in considerazione la definizione di una serie di versioni di overload.

  • La logica presente nel codice della routine varia in modo considerevole a seconda che nel codice chiamante sia specificato o meno un argomento facoltativo.

  • Il codice della routine non può verificare in modo affidabile se il codice chiamante ha fornito un argomento facoltativo. Questa situazione si verifica, ad esempio, se non è possibile prevedere alcun valore predefinito che possa essere fornito dal codice chiamante.

Utilizzo di parametri facoltativi

Di seguito sono illustrati i casi in cui è possibile utilizzare uno o più parametri facoltativi.

  • L'unica azione obbligatoria quando nel codice chiamante non è specificato un argomento facoltativo consiste nell'impostare il parametro su un valore predefinito. In tal caso, per semplificare il codice della routine è possibile definire un'unica versione con uno o più parametri Optional.

Per ulteriori informazioni, vedere Parametri facoltativi.

Overload e ParamArray

Se il codice chiamante può passare un numero variabile di argomenti, è possibile definire più versioni di overload o utilizzare una matrice di parametri.

Utilizzo di versioni di overload

Di seguito sono riportati i casi in cui è opportuno prendere in considerazione la definizione di una serie di versioni di overload.

  • Si è certi che il codice chiamante passa sempre un numero ridotto di valori alla matrice di parametri.

  • La logica presente nel codice della routine varia in modo considerevole in base al numero di valori passati dal codice chiamante.

  • Il codice chiamante può passare valori di diversi tipi di dati.

Utilizzo di una matrice di parametri

Di seguito sono riportati i casi in cui si consiglia l'utilizzo di un parametro ParamArray.

  • Non è possibile prevedere il numero di valori che il codice chiamante può passare alla matrice di parametri e potrebbe trattarsi di un numero di valori elevato.

  • La logica della routine è indicata per scorrere tutti i valori passati dal codice chiamante, dal momento che esegue le stesse operazioni su ogni valore.

Per ulteriori informazioni, vedere Matrici di parametri.

Overload impliciti per i parametri facoltativi

Una routine con un parametro Optional (Visual Basic) equivale a due routine di overload, una con il parametro facoltativo e una senza. Non è possibile eseguire l'overload di una routine di questo tipo con un elenco di parametri corrispondente a uno di quelli riportati di seguito. Questa situazione viene illustrata nelle dichiarazioni seguenti.

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ù parametri facoltativi esiste un insieme di overload impliciti, che sono il risultato di una logica simile a quella dell'esempio precedente.

Overload impliciti per un parametro ParamArray

Il compilatore presuppone che una routine con un parametro ParamArray disponga di un numero infinito di overload, che si differenziano l'uno dall'altro in base agli elementi passati dal codice chiamante alla matrice di parametri, come illustrato di seguito:

  • Un overload quando il codice chiamante non fornisce un argomento al parametro ParamArray

  • Un overload quando il codice chiamante fornisce una matrice unidimensionale del tipo di elemento ParamArray

  • Per ogni valore integer positivo, un overload quando il codice chiamante fornisce tale numero di argomenti, ciascuno del tipo di elemento ParamArray

Nelle dichiarazioni riportate di seguito vengono illustrati 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. È invece possibile utilizzare le firme di altri overload impliciti. Questa situazione viene illustrata nelle dichiarazioni seguenti.

' 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

Per consentire al codice chiamante di passare a un parametro tipi di dati diversi, un metodo alternativo è costituito dalla Programmazione senza tipi in Visual Basic. È possibile impostare l'opzione di controllo dei tipi su Off con l'Istruzione Option Strict o con l'opzione del compilatore /optionstrict. Non è quindi necessario dichiarare il tipo di dati del parametro. Rispetto all'overload, tuttavia, questo metodo presenta i seguenti svantaggi:

  • La programmazione senza tipi produce un codice di esecuzione meno efficace.

  • È necessario che la routine verifichi ogni tipo di dati del quale anticipa il passaggio.

  • Il compilatore non può segnalare un errore se il codice chiamante passa un tipo di dati non supportato dalla routine.

Vedere anche

Attività

Risoluzione dei problemi relativi alle routine

Procedura: definire più versioni di una routine

Procedura: chiamare una routine di overload

Procedura: overload di una routine che accetta parametri facoltativi

Procedura: eseguire l'overload di una routine che accetta un numero indefinito di parametri

Concetti

Routine in Visual Basic

Parametri e argomenti delle routine

Risoluzione dell'overload

Riferimenti

Overloads