В обработке пользовательского ввода критически важно предотвращать ошибки преобразования типов, когда пользователь, например, вводит не число в TextBox. Это актуально для обеспечения устойчивости работы приложения.
История вопроса:
В VB6 и VB.NET ошибки преобразования (например, с помощью CInt или Val) приводили к аварийным ситуациям. Позже появились более безопасные средства, такие как Integer.TryParse.
Проблема:
При попытке преобразовать неверные данные (буквы, специальные символы, пустую строку) стандартные способы (CInt, CDbl) выбрасывают исключение. В результате приложение может аварийно завершиться.
Решение:
Для безопасного преобразования используйте TryParse. Он возвращает логический успех операции перевода строки в число и предотвращает исключения.
Пример кода:
Dim input As String = TextBox1.Text Dim number As Integer If Integer.TryParse(input, number) Then MessageBox.Show($"Вы ввели число: {number}") Else MessageBox.Show("Ошибка: введено не число") End If
Ключевые особенности:
TryParse не выбрасывает исключения при неудачеЧто вернет функция Val("123abc") и почему это может быть опасно?
Val("123abc") вернет 123, игнорируя нецифровые символы после числа, что приводит к ошибкам, если пользователь случайно ввёл лишний символ.
Можно ли преобразовать пустую строку с помощью CInt("")?
Нет, функция выбросит исключение InvalidCastException.
Какой подход выбрать для чисел с плавающей точкой с учетом локализации?
Используйте Double.TryParse с указанием CultureInfo, так как в некоторых локалях запятая , — это разделитель дробной части, в других — точка ..
Dim value As Double Dim isParsed = Double.TryParse("3,14", NumberStyles.Any, CultureInfo.CurrentCulture, value)
Val для получения числа с неконтролируемым результатомCInt без проверки содержимогоРазработчик напрямую преобразует текст из поля в число: Dim n = CInt(TextBox1.Text) без проверки.
Плюсы:
Минусы:
Используется TryParse с оповещением пользователя о некорректном вводе (см. пример выше).
Плюсы:
Минусы: