In Visual Basic, il problema della conversione dei tipi è emerso sin dalle prime versioni del linguaggio ed è diventato particolarmente rilevante con l'introduzione della tipizzazione rigorosa e delle gerarchie multiple di classi in .NET.
L'obiettivo principale è garantire una conversione sicura ed esplicita tra tipi di dati compatibili, tenendo conto del tempo di esecuzione e della possibilità di errori.
La soluzione è che in VB.NET sono previsti i seguenti operatori di casting: CType, DirectCast, TryCast.
CType esegue la conversione tra qualsiasi tipo compatibile e può richiamare l'implementazione dell'interfaccia IConvertible.DirectCast richiede rigorosamente la compatibilità dei tipi nella gerarchia di ereditarietà e non esegue la conversione dei tipi, ma solo il casting di riferimento.TryCast restituisce Nothing se non è possibile eseguire il casting, senza generare un'eccezione (è adatto solo per i tipi di riferimento).Esempio di codice:
Class Animal : End Class Class Dog Inherits Animal End Class Dim a As Animal = New Dog() Dim d1 As Dog = CType(a, Dog) Dim d2 As Dog = DirectCast(a, Dog) Dim d3 As Dog = TryCast(a, Dog) ' d3 è oggetto Dog o Nothing
Caratteristiche chiave:
CType è il più universale, ma può generare eccezioni se la conversione non è possibile.DirectCast controlla solo la corrispondenza rigorosa del tipo di riferimento.TryCast non genera eccezioni, ma restituisce semplicemente Nothing.È possibile utilizzare TryCast per i tipi di valore (Value Types)?
No, TryCast funziona solo con i tipi di riferimento. Qualora si provi a utilizzarlo per una struttura, si avrà un errore di compilazione.
Qual è la differenza tra CInt(obj) e CType(obj, Integer)?
Sembiano simili, entrambi tentano di convertire obj in Integer. Tuttavia, CInt è più rigoroso nella definizione del formato della stringa ed è preferibile usare CType quando ci sono conversioni esplicite.
Quando è meglio utilizzare DirectCast invece di CType?
Quando si sa che gli oggetti sono collegati da una relazione di ereditarietà o implementano la stessa interfaccia, e non è necessaria una conversione personalizzata. DirectCast è più efficiente poiché non richiama la logica di conversione.
Nel progetto si utilizza sempre CType per tutte le conversioni, il che porta a eccezioni non gestite quando i tipi non sono compatibili.
Pro:
Contro:
Il team utilizza diversi operatori: DirectCast per le strutture di riferimento, TryCast quando si lavora con oggetti sconosciuti. È stata aggiunta la gestione di Nothing per TryCast.
Pro:
Contro: