A17. Conversioni di dati
Il Framework .Net è in grado di eseguire conversioni automatiche a runtime verso tipi di ampiezza maggiore, per esempio è in grado di
convertire Int16 in Int32, Char in String, Boolean in Byte e via dicendo. Queste operazioni di conversione vengono dette widening
(dall'inglese wide = largo), ossia che depongo un valore contenuto in una variabile che occupa dello spazio in una che ne occupa di più.
Fin qui nessun problema. Gli operatori di conversione servono per eseguire conversioni che vanno nella direzione opposta, e che sono quindi,
narrowing (dall'inglese narrow = stretto). Queste ultime possono comportare la perdita di dati e perciò generano un errore se implicite.
CType
CType è l'operatore di conversione universale e permette la conversione di qualsiasi tipo in qualsiasi altro tipo, almeno quando questa è
possibile. La sintassi è molto semplice:
[Variabile] = CType([Valore da convertire], [Tipo in cui convertire])Ad esempio:
Questa lista riporta alcuni casi in cui è bene usare esplicitamente l'operatore di conversione CType:Dim IAs Int32 = 50 'Converte I in un valore Byte Dim BAs Byte = CType(I,Byte )
- Per convertire un valore intero o decimale in un valore booleano
- Per convertire un valore Single o Double in Decimal
- Per convertire un valore intero con segno in uno senza segno
- Per convertire un valore intero senza segno in uno con segno della stessa ampiezza (ad esempio da UInt32 a Int32)
DirectCast
DirectCast lavora in un modo leggermente di diverso: CType tenta sempre di convertire l'argomento di orgine nel tipo specificato, mentre
DirectCast lo fa solo se tale valore può essere sottoposto al casting (al "passaggio" da un tipo all'altro, piuttosto che alla conversione)
verso il tipo indicato. Perciò non è, ad esempio, in grado di convertire una stringa in intero, e neanche un valore short in un integer,
sebbene questa sia una conversione di espansione. In generale, quindi, dato il leggero risparmio di tempo di DirectCast in confronto a CType,
è conveniente usare DirectCast:
- Per eseguire l'unboxing di tipi value
- Per eseguire il casting di una classe base in una classe derivata (vedi "Ereditarieta'")
- Per eseguire il casting di un oggetto in qualsiasi altro tipo reference
- Per eseguire il casting di un oggetto in un'interfaccia
TryCast
TryCast ha la stessa sintassi di DirectCast, e quindi anche di CType, ma nasconde un piccolo pregio. Spesso, quando si esegue una conversione
si deve prima controllare che la variabile in questione sia di un determinato tipo base o implementi una determinata interfaccia e solo
successivamente si esegue la conversione vera e propria. Con ciò si controlla due volte la stessa variabile, prima con l'If e poi con
DirectCast. TryCast, invece, permette di eseguire il tutto in un unico passaggio e restituisce semplicemente Nothing se il cast fallisce.
Questo approccio rende tale operatore circa 0,2 volte più veloce di DirectCast.TypeOf
TypeOf serve per controllare se una variabile è di un certo tipo, deriva da un certo tipo o implementa una certa interfaccia, ad esempio:
Dim IAs Int32If TypeOf IIs Int32Then 'Questo blocco viene eseguito poichè I è di tipo Int32 End If
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



