Newsgroup: it.comp.lang.visual-basic
Titolo: [.NET] Conversione di tipi

Colgo l' occasione dell' ottima risposta di Corrado nel thread
"Imports System.IO (.net)" per approfondire quanto in oggetto.
Mi pare d'aver capito che in 
vb.net
 per fare conversioni di tipo,
ad esempio da String a Int32, come nel thread citato (e che io
avevo pure capito a rovescio :-P) si possono seguire quattro strade:
1. il metodo statico Parse della classe relativa al
tipo in cui si vuole convertire;
2. il tipo Convert;
3. la funzione CType;
4. l'interfaccia IConvertible, se supportata, ma non e' CLS-compliant
e poi bisogna scrivere troppo ;-P
Ho quindi svolto il seguente esperimento, consistente nell'esame del
codice IL generato dalla compilazione di seguente codice vb:
<codice>
Module Module1
    Sub Main()
	Dim nNumero As Integer
	Dim sNumero As String = "500"
	nNumero = Integer.Parse(sNumero)
	nNumero = Convert.ToInt32(sNumero)
	nNumero = CType(sNumero, Integer)
    End Sub
End Module
</codice>
L' IL prodotto e', in sintesi:
1. per "nNumero = Integer.Parse(sNumero)":
int32 [mscorlib]System.Int32::Parse(string)
che, a sua volta, chiama:
	int32 System.Int32::Parse(string,
		valuetype System.Globalization.NumberStyles,
		class System.IFormatProvider)
Questa soluzione si e' rivelata la piu' efficiente,
come, del resto, Corrado aveva suggerito.
2. per "nNumero = Convert.ToInt32(sNumero)"
int32 [mscorlib]System.Convert::ToInt32(string)
che, a sua volta, chiama:
	int32 System.Int32::Parse(string)
e quindi:
	int32 System.Int32::Parse(string,
		valuetype System.Globalization.NumberStyles,
		class System.IFormatProvider) 
In pratica l' uso di Convert rispetto a Parse
comporta un passaggio in piu'.
3. per "nNumero = CType(sNumero, Integer)"
questa soluzione, se non ho sbagliato qualcosa, mi sembra
assolutamente da evitare poiche' chiama
int32
[Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.IntegerType::FromString(string)
e da li' il codice fa piu' giri che l'acqua nei tubi.
A chi e' rimasto sveglio fino a qui, chiedo:
1. Ho dimenticato qualche altro modo di convertire tra un tipo ed un
altro (in 
vb.net
, intendo, pero', se gradite, si potrebbe conrontare
anche con altri dialetti .net)?
2. Quand'e' che conviene la conversione accedendo ad IConvertible?
Forse solo con i reference type?
Oppure e' da intendersi come interfaccia da implementare per le
proprie classi?
-- 
ciao, hal

Per completare l'opera citerei la funzione DirectCast la quale, pur non
essendo applicabile all'esempio origine di questo thread può entrare a far
parte delle funzioni di 'conversione'.
Come indicato da MSDN DirectCast ha prestazioni migliori rispetto a CType
anche se, meno flessibile, ad esempio il primo parametro deve essere per
forza un reference type mentre CType accetta anche valuetypes.
HTH
--
Corrado Cavalli [Microsoft MVP]
UGIdotNET - 
http://www.ugidotnet.org

parte delle funzioni di 'conversione'.
Uh, grazie mille, vado, smonto e provo :-)
-- 
ciao, hal

 Uh, grazie mille, vado, smonto e provo :-)
Facci sapere, così aggiorno anche il mio post. :P
P.S.: hehe, tutto questo è un bel motivo in più per saltare a piè pari tutte
le funzioni che fanno uso del VisualBasic runtime :)
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"

 Dim nNumero As Integer
la guida informa che la variabile Integer č:
Riferimenti del linguaggio Visual Basic
ed aggiunge: Il tipo di dati .NET equivalente č System.Int32.
lascio Integer
rimuovo Microsoft.VisualBasic da Riferimenti importati, avvio , mi aspetto
un messaggio di errore.
Invece funziona.
Devo interpretare che il runtime esegue qualche conversione ?
giuseppeD


.A
UGIdotNET - 
http://www.ugidotnet.org


[SNIP]
Per quanto riguarda la conversione tra tipi base, un vantaggio di Convert
rispetto a Parse, che forse compensa all'atto pratico il passaggio in piu',
e' che dispone di innumerevoli overloads per ciascun metodo 'To<qualcosa>'
con tutti i possibili tipi in ingresso, mentre i vari Parse accettano solo
stringhe...
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown