Condividi tramite


Considerazioni sulle procedure di sovraccarico (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 Sovraccarico delle procedure.

È possibile eseguire l'overload di una Function procedura con una Sub procedura e viceversa, purché abbiano signature differenti. Due sovraccarichi non possono differire solo in quanto 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 procedura e con le stesse restrizioni. Tuttavia, non è possibile eseguire l'overload di una procedura con una proprietà, o viceversa.

Alternative alle versioni sovraccarico

A volte hai alternative alle versioni sovraccariche, particolarmente quando la presenza di argomenti è facoltativa o il loro 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 stai scrivendo una procedura che è probabilmente chiamata da codice scritto in uno dei diversi linguaggi, le versioni sovraccaricate offrono la massima flessibilità.

Sovraccarichi e argomenti facoltativi

Quando il codice chiamante può facoltativamente specificare o omettere uno o più argomenti, è possibile definire diverse versioni sovraccaricate o usare parametri facoltativi.

Quando usare versioni sovraccariche

Puoi considerare la definizione di una serie di versioni sovraccaricate nei casi seguenti:

  • La logica nel 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. Questo è il caso, ad esempio, se non esiste un possibile candidato per un valore predefinito che il codice chiamante non potrebbe ragionevolmente fornire.

Quando usare 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 procedura può essere meno complesso se si definisce una singola versione con uno o più Optional parametri.

Per altre informazioni, vedere Parametri facoltativi.

Overload e ParamArrays

Quando il codice chiamante può passare un numero variabile di argomenti, è possibile definire più versioni sovraccaricate o usare un array di parametri.

Quando usare versioni sovraccariche

Puoi considerare la definizione di una serie di versioni sovraccaricate 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 nel 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 ParamArray parametro nei casi seguenti:

  • Non è possibile stimare 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 Facoltativo equivale a due routine di overload, una con il parametro facoltativo e una senza di essa. Non è possibile eseguire l'overload di una di queste procedure con un elenco di parametri corrispondente a uno di questi. Le dichiarazioni seguenti illustrano questa situazione.

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 procedura con più di un parametro facoltativo, è presente un set di overload impliciti, arrivato dalla logica simile a quello dell'esempio precedente.

Sovraccarichi impliciti per un parametro ParamArray

Il compilatore considera una routine con un parametro ParamArray in modo che abbia un numero infinito di overload, che differisce l'uno dall'altro rispetto a quello che il codice chiamante passa alla matrice di parametri, come indicato di seguito:

  • Un overload da usare quando nel codice che effettua la chiamata non viene fornito un argomento a ParamArray

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

  • Per ogni numero intero positivo, un overload per quando il codice chiamante fornisce tale numero di argomenti, ognuno del ParamArray tipo di elemento

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 utilizzare le definizioni degli altri sovraccarichi impliciti. Le dichiarazioni seguenti illustrano questa situazione.

' 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'interruttore di controllo tipo su Off utilizzando l'istruzione Option Strict o l'opzione del compilatore -optionstrict. Non è quindi necessario dichiarare il tipo di dati del parametro. Tuttavia, questo approccio presenta i seguenti svantaggi rispetto al sovraccarico.

  • La programmazione senza tipi produce codice di esecuzione meno efficiente.

  • La procedura deve verificare ogni tipo di dato che si prevede venga passato.

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

Vedere anche