В Visual Basic данные часто вводятся пользователем как строки (например, через TextBox или InputBox), однако для дальнейшей работы требуется преобразовать их в числовые типы. В ранних версиях VB применялось нестрогое преобразование через Val или CInt, что приводило к явным и неявным ошибкам при некорректных данных. Предполагалось, что строка всегда содержит правильное значение, но на практике пользователи вводят неверные символы, что вызывает ошибки или некорректные преобразования.
Проблема — незащищённость преобразования, приводящая к падению приложения или неправильным расчетам. Например, Val("1a") вернет 1, что может бытьunexpected. Использование TryParse и строгая проверка формата ввода позволяют избежать таких ошибок и корректно обрабатывать ввод.
Решением является применение метода Integer.TryParse (или Double.TryParse и др.), который возвращает True только при успешном преобразовании.
Пример кода:
Dim input As String = TextBox1.Text Dim value As Integer If Integer.TryParse(input, value) Then ' Введено корректное число, переменная value содержит значение Else MessageBox.Show("Пожалуйста, введите целое число") End If
Ключевые особенности:
Чем опасна функция Val при обработке пользовательского ввода?
Val возвращает числовое значение до первого недопустимого символа и не выбрасывает ошибку, что может приводить к некорректной логике.
Dim n = Val("12abc") ' Вернет 12, хотя строка некорректна
В чём разница между CInt и Integer.Parse?
CInt выполняет округление с банкer's rounding, а Integer.Parse требует точного совпадения строки с числом и выбрасывает исключение при ошибке.
Почему TryParse не всегда вернет True для строки "1,234"?
Результат зависит от региональных настроек Windows: где-то разделитель дробной части — запятая, где-то точка. Важно явно указывать формат:
Dim number As Double Double.TryParse("1,234", NumberStyles.Any, CultureInfo.InvariantCulture, number)
Финансовый модуль принимал данные через InputBox, преобразовывал через Val, сумма 10,5 становилась 10 в некоторых случаях (запятая не распознавалась, а точка не была введена).
Плюсы:
Минусы:
Переход на TryParse с учетом культурных настроек и валидации поля ввода.
Плюсы:
Минусы: