In Visual Basic werden Daten häufig vom Benutzer als Strings eingegeben (zum Beispiel über TextBox oder InputBox), jedoch müssen sie für die weitere Verarbeitung in numerische Typen umgewandelt werden. In früheren Versionen von VB wurde eine schwache Umwandlung über Val oder CInt verwendet, was zu offensichtlichen und nicht offensichtlichen Fehlern bei fehlerhaften Daten führte. Es wurde angenommen, dass der String immer einen korrekten Wert enthält, aber in der Praxis geben Benutzer falsche Zeichen ein, was Fehler oder fehlerhafte Umwandlungen verursacht.
Das Problem ist die Unsicherheit der Umwandlung, die zu einem Absturz der Anwendung oder zu falschen Berechnungen führt. Zum Beispiel gibt Val("1a") den Wert 1 zurück, was unerwartet sein kann. Die Verwendung von TryParse und eine strenge Überprüfung des Eingabeformats ermöglichen es, solche Fehler zu vermeiden und die Eingabe korrekt zu verarbeiten.
Die Lösung besteht darin, die Methode Integer.TryParse (oder Double.TryParse usw.) zu verwenden, die nur dann True zurückgibt, wenn die Umwandlung erfolgreich war.
Beispielcode:
Dim input As String = TextBox1.Text Dim value As Integer If Integer.TryParse(input, value) Then ' Es wurde eine korrekte Zahl eingegeben, die Variable value enthält den Wert Else MessageBox.Show("Bitte geben Sie eine ganze Zahl ein") End If
Wichtige Aspekte:
Was ist gefährlich an der Funktion Val beim Verarbeiten von Benutzereingaben?
Val gibt den numerischen Wert bis zum ersten ungültigen Zeichen zurück und löst keinen Fehler aus, was zu einer fehlerhaften Logik führen kann.
Dim n = Val("12abc") ' Gibt 12 zurück, obwohl der String ungültig ist
Was ist der Unterschied zwischen CInt und Integer.Parse?
CInt führt eine Rundung mit Banker's Rounding durch, während Integer.Parse eine exakte Übereinstimmung des Strings mit der Zahl verlangt und bei einem Fehler eine Ausnahme auslöst.
Warum wird TryParse nicht immer True für den String "1,234" zurückgeben?
Das Ergebnis hängt von den Regionaleinstellungen von Windows ab: Wo das Dezimaltrennzeichen ein Komma ist, woanders ein Punkt. Es ist wichtig, das Format eindeutig anzugeben:
Dim number As Double Double.TryParse("1,234", NumberStyles.Any, CultureInfo.InvariantCulture, number)
Das Finanzmodul nahm Daten über InputBox entgegen, wandelte sie über Val um, und die Summe 10,5 wurde in einigen Fällen zu 10 (das Komma wurde nicht erkannt, und der Punkt wurde nicht eingegeben).
Vorteile:
Nachteile:
Übergang zu TryParse unter Berücksichtigung der kulturellen Einstellungen und Validierung des Eingabefeldes.
Vorteile:
Nachteile: