En Visual Basic, les conversions de types peuvent être explicites et implicites :
CInt(), CDbl(), CStr(), DirectCast, TryCast, etc.Pour plus de fiabilité, il est recommandé de :
Option Strict On — cela interdit les conversions implicites, exigeant des conversions explicites et prévenant les erreurs d'exécution.Exemple :
Option Strict On Dim a As Integer Dim b As Double = 4.5 'a = b ' Erreur de compilation ! a = CInt(b) ' Correct : Conversion explicite avec une possible perte de la fraction 'Conversion de chaînes Dim s As String = "123" Dim n As Integer = Integer.Parse(s)
Quels sont les risques liés à l'utilisation de la fonction Val() pour convertir une chaîne en nombre, et pourquoi est-elle souvent déconseillée ?
Réponse :
Val() ne convertit que le début numérique de la chaîne jusqu'au premier caractère non numérique. Si la chaîne commence par une lettre ou un symbole spécial, elle retourne 0. Cela peut masquer des erreurs si une conversion de la valeur entière était attendue.
Exemple :
Dim value1 = Val("123abc") ' donnera 123 Dim value2 = Val("abc123") ' donnera 0 ! ' Il vaut mieux utiliser : Integer.TryParse("abc123", val)
Histoire
Dans un système ERP, des valeurs étaient lues à partir d'une base de données, et en raison de la conversion implicite d'une chaîne en Integer sans vérification, une exception était levée avec des données incorrectes. Cela a arrêté le fonctionnement de tout le module de reporting.
Histoire
Lors de l'intégration avec un ancien système, un programmeur a utilisé Val pour convertir des chaînes, et certaines chaînes commençaient par des lettres (par exemple, "A1234"). Résultat — perte d'identifiants mal interprétés comme 0, et défaillance dans le programme de fidélité des clients.
Histoire
Un développeur a utilisé DirectCast lors de la conversion d'objets sans vérifier la compatibilité des types. Lorsqu'un objet d'un type inattendu est arrivé, une InvalidCastException a été levée et la chaîne de traitement des données s'est rompue.