В Visual Basic можно использовать параметр ParamArray для передачи переменного числа аргументов в процедуру или функцию. Это удобный способ для создания методов с нефиксированным количеством параметров одного типа.
Sub ShowNumbers(ParamArray numbers() As Integer) For Each n As Integer In numbers Console.WriteLine(n) Next End Sub ' Вызовы: ShowNumbers(1, 2, 3, 4) ShowNumbers() ' возможен вызов без аргументов
ParamArray может быть только один и только последний в списке.ParamArray всегда передаются как массив и не могут быть ByRef.ParamArray позволяет одной процедуре принимать разное число параметров одного типа, а перегрузка создает несколько методов с разными подписями.
Пример перегрузки:
Sub Add(a As Integer, b As Integer) ' ... End Sub Sub Add(a As Integer, b As Integer, c As Integer) ' ... End Sub
Когда использовать:
ParamArray: когда параметров много одного типа.Вопрос: Может ли процедура содержать одновременно ParamArray и другие параметры, какие ограничения на их порядок?
Ответ: Да, может, но ParamArray обязательно должен быть последним параметром и только один в подписи функции.
Пример неправильного использования:
Sub Test(ParamArray x() As Integer, y As String) ' Ошибка компиляции End Sub
Правильный вариант:
Sub Test(y As String, ParamArray x() As Integer) ' Корректно End Sub
История
Построили функцию для сбора данных из разных источников с ParamArray, но во множестве случаев передавали массивы вручную. Разработчик не заметил, что передача массива приводит к вложенному массиву (массив массивов), в результате обработка всегда происходила некорректно, портились данные отчетности.
История
Для универсального построения SQL-запросов использовался ParamArray String-аргументов, но при обновлении метода добавили обязательный параметр после ParamArray. Вся система перестала компилироваться.
История
Для перегрузки методов с разными наборами параметров применяли и ParamArray, и Overloading. Это привело к амбигуити коллизиям: компилятор не всегда мог определить, какой вариант метода вызывать, потому что ParamArray подходил под несколько перегрузок сразу.