In Visual Basic worden gegevens vaak door de gebruiker ingevoerd als strings (bijvoorbeeld via TextBox of InputBox), maar voor verdere verwerking moeten ze worden omgezet naar numerieke types. In eerdere versies van VB werd ongestrikte conversie toegepast via Val of CInt, wat leidde tot duidelijke en verborgen fouten bij onjuiste gegevens. Er werd aangenomen dat de string altijd een correcte waarde bevatte, maar in de praktijk geven gebruikers verkeerde symbolen in, wat fouten of onjuiste conversies kan veroorzaken.
Het probleem is de onbeschermde conversie, die kan leiden tot een crash van de applicatie of onjuiste berekeningen. Bijvoorbeeld, Val("1a") retourneert 1, wat onverwacht kan zijn. Het gebruik van TryParse en strikte invoerformaatcontrole helpt dergelijke fouten te voorkomen en de invoer correct te verwerken.
De oplossing is het toepassen van de methode Integer.TryParse (of Double.TryParse en anderen), die alleen True retourneert bij een succesvolle conversie.
Voorbeeldcode:
Dim input As String = TextBox1.Text Dim value As Integer If Integer.TryParse(input, value) Then ' Een correct getal is ingevoerd, de variabele value bevat de waarde Else MessageBox.Show("Voer alstublieft een geheel getal in") End If
Belangrijke kenmerken:
Wat is het gevaar van de functie Val bij het verwerken van gebruikersinvoer?
Val retourneert een numerieke waarde tot het eerste ongeldige symbool en gooit geen fout, wat kan leiden tot onjuiste logica.
Dim n = Val("12abc") ' Retouneert 12, terwijl de string ongeldig is
Wat is het verschil tussen CInt en Integer.Parse?
CInt voert afronding uit met banker's rounding, terwijl Integer.Parse een exacte overeenkomst van de string met het getal vereist en een uitzondering gooit bij een fout.
Waarom retourneert TryParse niet altijd True voor de string "1,234"?
Het resultaat hangt af van de regionale instellingen van Windows: soms is de decimale scheiding het komma, soms de punt. Het is belangrijk om het formaat expliciet op te geven:
Dim number As Double Double.TryParse("1,234", NumberStyles.Any, CultureInfo.InvariantCulture, number)
De financiële module accepteerde gegevens via InputBox, verwerkte deze via Val, som 10,5 werd 10 in sommige gevallen (de komma werd niet herkend, terwijl de punt niet was ingevoerd).
Voordelen:
Nadelen:
Overstap naar TryParse rekening houdend met culturele instellingen en validatie van het invoerveld.
Voordelen:
Nadelen: