Casino online











Mercato forex






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:
Dim I As Int32 = 50
'Converte I in un valore Byte
Dim B As Byte = CType(I, Byte) 
Questa lista riporta alcuni casi in cui è bene usare esplicitamente l'operatore di conversione CType:
  • 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)
Oltre a CType, esistono moltissime versioni più corte di quest'ultimo che convertono in un solo tipo: CInt converte sempre in Int32, CBool sempre in booleano, CByte in byte, CShort Int16, CLong, CUShort, CULong, CUInt, CSng, CDbl, CDec, CStr, CDate, CObj. È inopportuno utilizzare CStr poichè ci si può sevire della funzione ToString ereditata da ogni classe da System.Object; allo stesso modo, è meglio evitare CDate, a favore di Date.Parse, come si vedrà nella lezione "DateTimePicker: Lavorare con le date".


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 I As Int32
If TypeOf I Is Int32 Then
  '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.