In Visual Basic è possibile utilizzare il parametro ParamArray per passare un numero variabile di argomenti a una procedura o a una funzione. Questo è un modo conveniente per creare metodi con un numero non fisso di parametri dello stesso tipo.
Sub ShowNumbers(ParamArray numbers() As Integer) For Each n As Integer In numbers Console.WriteLine(n) Next End Sub ' Chiamate: ShowNumbers(1, 2, 3, 4) ShowNumbers() ' chiamata possibile senza argomenti
ParamArray può essere solo uno e solo l'ultimo nella lista.ParamArray vengono sempre passati come array e non possono essere ByRef.ParamArray consente a una procedura di accettare un numero diverso di parametri dello stesso tipo, mentre l'overloading crea diversi metodi con firme diverse.
Esempio di overloading:
Sub Add(a As Integer, b As Integer) ' ... End Sub Sub Add(a As Integer, b As Integer, c As Integer) ' ... End Sub
Quando usare:
ParamArray: quando ci sono molti parametri dello stesso tipo.Domanda: Può una procedura contenere simultaneamente ParamArray e altri parametri, quali sono i limiti sul loro ordine?
Risposta: Sì, può, ma ParamArray deve essere necessariamente l'ultimo parametro e solo uno nella firma della funzione.
Esempio di utilizzo errato:
Sub Test(ParamArray x() As Integer, y As String) ' Errore di compilazione End Sub
Versione corretta:
Sub Test(y As String, ParamArray x() As Integer) ' Corretto End Sub
Storia
Abbiamo costruito una funzione per raccogliere dati da diverse fonti con ParamArray, ma in molti casi passavamo manualmente array. Lo sviluppatore non si è accorto che il passaggio di un array portava a un array annidato (array di array), di conseguenza l'elaborazione avveniva sempre in modo scorretto, danneggiando i dati del reporting.
Storia
Per la costruzione universale delle query SQL venivano utilizzati ParamArray di argomenti String, ma durante l'aggiornamento del metodo è stato aggiunto un parametro obbligatorio dopo ParamArray. L'intero sistema ha smesso di compilarsi.
Storia
Per l'overloading dei metodi con diversi set di parametri venivano utilizzati sia ParamArray che Overloading. Questo ha portato a conflitti di ambiguità: il compilatore non riusciva sempre a determinare quale variante del metodo chiamare, poiché ParamArray si adattava a più overload contemporaneamente.