W obsłudze wejścia użytkownika kluczowe jest zapobieganie błędom konwersji typów, gdy użytkownik na przykład wpisuje coś, co nie jest liczbą w TextBox. Jest to ważne dla zapewnienia odporności działania aplikacji.
Historia pytania:
W VB6 i VB.NET błędy konwersji (na przykład za pomocą CInt lub Val) prowadziły do awarii. Później pojawiły się bezpieczniejsze środki, takie jak Integer.TryParse.
Problem:
Przy próbie konwersji nieprawidłowych danych (litery, znaki specjalne, pusty ciąg) standardowe metody (CInt, CDbl) rzucają wyjątek. W rezultacie aplikacja może zakończyć działanie w sposób nieoczekiwany.
Rozwiązanie:
Do bezpiecznej konwersji użyj TryParse. Zwraca on logiczny wynik operacji przekształcenia ciągu na liczbę i zapobiega wyjątkami.
Przykład kodu:
Dim input As String = TextBox1.Text Dim number As Integer If Integer.TryParse(input, number) Then MessageBox.Show($"Wprowadziłeś liczbę: {number}") Else MessageBox.Show("Błąd: wprowadzono coś, co nie jest liczbą") End If
Kluczowe cechy:
TryParse nie rzuca wyjątków przy niepowodzeniuCo zwróci funkcja Val("123abc") i dlaczego może to być niebezpieczne?
Val("123abc") zwróci 123, ignorując niecyfrowe znaki po liczbie, co prowadzi do błędów, jeśli użytkownik przypadkowo wprowadzi dodatkowy znak.
Czy można przekonwertować pusty ciąg za pomocą CInt("")?
Nie, funkcja zgłosi wyjątek InvalidCastException.
Jaki podejście wybrać dla liczb zmiennoprzecinkowych z uwzględnieniem lokalizacji?
Użyj Double.TryParse z określeniem CultureInfo, ponieważ w niektórych lokalizacjach przecinek , jest separatorem części dziesiętnej, a w innych kropka ..
Dim value As Double Dim isParsed = Double.TryParse("3,14", NumberStyles.Any, CultureInfo.CurrentCulture, value)
Val do uzyskania liczby z niekontrolowanym wynikiemCInt bez sprawdzania zawartościProgramista bezpośrednio konwertuje tekst z pola na liczbę: Dim n = CInt(TextBox1.Text) bez sprawdzenia.
Zalety:
Wady:
Użycie TryParse z powiadomieniem użytkownika o nieprawidłowym wejściu (patrz powyższy przykład).
Zalety:
Wady: