W Visual Basic dane często są wprowadzane przez użytkownika jako ciągi (na przykład przez TextBox lub InputBox), jednak w celu dalszej pracy wymagane jest ich przekształcenie w typy numeryczne. We wcześniejszych wersjach VB stosowano luźne przekształcenie przez Val lub CInt, co prowadziło do oczywistych i nieoczywistych błędów przy niepoprawnych danych. Zakładano, że ciąg zawsze zawiera poprawną wartość, lecz w praktyce użytkownicy wprowadzają błędne znaki, co powoduje błędy lub niepoprawne przekształcenia.
Problemem jest brak ochrony przekształcenia, prowadzący do awarii aplikacji lub błędnych obliczeń. Na przykład, Val("1a") zwróci 1, co może być niespodziewane. Użycie TryParse i ścisła weryfikacja formatu wejścia pozwala uniknąć takich błędów i poprawnie przetwarzać dane wejściowe.
Rozwiązaniem jest zastosowanie metody Integer.TryParse (lub Double.TryParse itd.), która zwraca True tylko w przypadku udanego przekształcenia.
Przykład kodu:
Dim input As String = TextBox1.Text Dim value As Integer If Integer.TryParse(input, value) Then ' Wprowadzono poprawną liczbę, zmienna value zawiera wartość Else MessageBox.Show("Proszę wprowadzić liczbę całkowitą") End If
Kluczowe cechy:
Jakie są zagrożenia związane z funkcją Val przy przetwarzaniu wejścia od użytkownika?
Val zwraca wartość numeryczną do pierwszego niepoprawnego znaku i nie zgłasza błędu, co może prowadzić do niepoprawnej logiki.
Dim n = Val("12abc") ' Zwróci 12, chociaż ciąg jest niepoprawny
Jaka jest różnica między CInt a Integer.Parse?
CInt wykonuje zaokrąglanie zgodnie z zaokrąglaniem bankowym, a Integer.Parse wymaga dokładnego dopasowania ciągu do liczby i zgłasza wyjątek w przypadku błędu.
Dlaczego TryParse nie zawsze zwraca True dla ciągu "1,234"?
Wynik zależy od ustawień regionu Windows: gdzieś separatorem dziesiętnym jest przecinek, gdzie indziej kropka. Ważne jest, aby wyraźnie określić format:
Dim number As Double Double.TryParse("1,234", NumberStyles.Any, CultureInfo.InvariantCulture, number)
Moduł finansowy przyjmował dane przez InputBox, przekształcał przez Val, suma 10,5 stawała się 10 w niektórych przypadkach (przecinek nie był rozpoznawany, a kropka nie była wprowadzana).
Zalety:
Wady:
Przejście na TryParse z uwzględnieniem ustawień kulturowych i walidacji pola wejściowego.
Zalety:
Wady: