В Visual Basic (как Classic, так и .NET) для процедур и функций можно объявлять необязательные параметры с помощью ключевого слова Optional. Также возможно задать значения по умолчанию для таких параметров.
Синтаксис:
Sub SendMessage(message As String, Optional urgent As Boolean = False) If urgent Then Console.WriteLine("URGENT: " & message) Else Console.WriteLine(message) End If End Sub ' Вызовы: SendMessage("Привет!") ' urgent = False SendMessage("Важное сообщение!", True)
Важные нюансы:
- Параметры
Optionalвсегда должны быть последними в списке параметров.- Если отсутствует значение по умолчанию у параметра, оно определяется как
Nothingили по умолчанию для типа (например, 0 для Integer).- В классическом VB варианты типов Optional ограничены: нельзя использовать типы без значения по умолчанию (например, необнуляемые классы).
Вопрос: Можно ли в Visual Basic объявить обязательный параметр после необязательного (Optional)? Объясните, почему (нет/да) и как этого избежать.
Ответ: Нет, после объявления хотя бы одного параметра как Optional, все последующие параметры тоже должны быть объявлены с Optional. Это требование синтаксиса, чтобы избежать путаницы при передаче параметров по позициям.
Пример неверного кода:
Sub PrintReport(Optional pageSize As String = "A4", copies As Integer) ' Ошибка компиляции: обязательные параметры не могут идти после optional End Sub
Для решения — измените порядок параметров:
Sub PrintReport(copies As Integer, Optional pageSize As String = "A4") ' Корректный вариант End Sub
История
На крупном проекте заказчик добавил необязательный параметр к процедуре шаринга файлов, забыв про его требуемое значение по умолчанию. После этого при вызове метода без указания параметра обрабатывался
Nothingкак название файла, что вызывало ошибку загрузки.
История
В результате копирования сигнатуры метода из другой системы, порядок параметров был нарушен — обязательный параметр пошёл после
Optional. Программист исправил ошибку компиляции, изменив только порядок, но во всех вызовах не учёл, что теперь нумерация сместилась. Это вызвало некорректную работу функции более чем в 30 местах кода.
История
Для сокращения объёма кода было принято решение назначить пустую строку как значение по умолчанию для строкового параметра. Однако в ряде случаев обработка пустого значения отличалась от обработки пропущенного параметра и приводила к нелогичной логике работы диалога — вместо показа стандартного текста происходило скрытие формы без пояснений.