In Visual Basic, le conversioni di tipo possono essere esplicite e implicite:
CInt(), CDbl(), CStr(), DirectCast, TryCast e altri.Per affidabilità, si consiglia di:
Option Strict On — questo vieta le conversioni implicite, richiedendo conversioni esplicite e prevenendo errori di runtime.Esempio:
Option Strict On Dim a As Integer Dim b As Double = 4.5 'a = b ' Errore di compilazione! a = CInt(b) ' Corretto: Conversione esplicita con possibile perdita della parte frazionaria 'Conversione delle stringhe Dim s As String = "123" Dim n As Integer = Integer.Parse(s)
Quali rischi sono associati all'uso della funzione Val() per convertire una stringa in un numero e perché viene spesso sconsigliata?
Risposta:
Val() converte solo l'inizio numerico della stringa fino al primo simbolo non numerico. Se la stringa inizia con una lettera o un simbolo speciale, restituisce 0. Questo può nascondere errori, se ci si aspettava di convertire il valore intero.
Esempio:
Dim value1 = Val("123abc") ' restituirà 123 Dim value2 = Val("abc123") ' restituirà 0 ! ' Meglio utilizzare: Integer.TryParse("abc123", val)
Storia
In un sistema ERP i valori venivano letti dal database e a causa di una conversione implicita da stringa a Integer senza controllo, veniva sollevata un'eccezione in presenza di dati non validi. Questo fermava l'intero modulo di reportistica.
Storia
Durante l'integrazione con un sistema obsoleto, un programmatore utilizzava Val per convertire stringhe, e alcune stringhe iniziavano con lettere (ad esempio, "A1234"). Risultato — perdita di identificatori, interpretati erroneamente come 0, e malfunzionamento nel programma di fidelizzazione dei clienti.
Storia
Un sviluppatore utilizzava DirectCast per il casting degli oggetti senza controllare la compatibilità dei tipi. Quando arrivava un oggetto di tipo imprevisto, veniva sollevata un'InvalidCastException e si interrompeva la catena di elaborazione dati.