W Visual Basic można użyć parametru ParamArray do przekazywania zmiennej liczby argumentów do procedury lub funkcji. To wygodny sposób na tworzenie metod z niena stałą liczbą parametrów tego samego typu.
Sub ShowNumbers(ParamArray numbers() As Integer) For Each n As Integer In numbers Console.WriteLine(n) Next End Sub ' Wywołania: ShowNumbers(1, 2, 3, 4) ShowNumbers() ' możliwe wywołanie bez argumentów
ParamArray może być tylko jeden i tylko ostatni na liście.ParamArray zawsze są przekazywane jako tablica i nie mogą być ByRef.ParamArray pozwala jednej procedurze przyjmować różną liczbę parametrów tego samego typu, a przeciążanie tworzy kilka metod z różnymi podpisami.
Przykład przeciążania:
Sub Add(a As Integer, b As Integer) ' ... End Sub Sub Add(a As Integer, b As Integer, c As Integer) ' ... End Sub
Kiedy używać:
ParamArray: gdy jest wiele parametrów tego samego typu.Pytanie: Czy procedura może jednocześnie zawierać ParamArray i inne parametry, jakie są ograniczenia ich kolejności?
Odpowiedź: Tak, może, ale ParamArray musi być ostatnim parametrem i tylko jednym w podpisie funkcji.
Przykład nieprawidłowego użycia:
Sub Test(ParamArray x() As Integer, y As String) ' Błąd kompilacji End Sub
Prawidłowa wersja:
Sub Test(y As String, ParamArray x() As Integer) ' Poprawnie End Sub
Historia
Zbudowaliśmy funkcję do zbierania danych z różnych źródeł z ParamArray, ale w wielu przypadkach przekazywano tablice ręcznie. Programista nie zauważył, że przekazanie tablicy prowadzi do zagnieżdżonej tablicy (tablica tablic), w rezultacie przetwarzanie zawsze odbywało się niepoprawnie, psując dane raportów.
Historia
Do uniwersalnego budowania zapytań SQL używano ParamArray argumentów typu String, ale podczas aktualizacji metody dodano obowiązkowy parametr po ParamArray. Cały system przestał kompilować się.
Historia
Do przeciążania metod z różnymi zestawami parametrów używano zarówno ParamArray, jak i Overloading. Prowadziło to do kolizji ambiguitetowych: kompilator nie zawsze mógł określić, którą wersję metody wywołać, ponieważ ParamArray pasował do kilku przeciążeń jednocześnie.