2010-06-16 19 views
84

Sono un programmatore esperto C/C++/C# che è appena entrato in VB.NET. Generalmente uso CType (e CInt, CBool, CStr) per i cast perché sono meno caratteri ed è stato il primo modo di casting a cui sono stato esposto, ma sono a conoscenza anche di DirectCast e TryCast.Differenza tra DirectCast() e CType() in VB.NET

Semplicemente, ci sono differenze (effetto di cast, prestazioni, ecc.) Tra DirectCast e CType? Capisco l'idea di TryCast.

+6

Duplicazione esatta di questo * Casting DataTypes con DirectCast, CType, TryCast * http://stackoverflow.com/questions/2703585/casting-datatypes-with-directcast-ctype-trycast – MarkJ

+1

Possibile duplicato di [Casting DataTypes con DirectCast, CType, TryCast] (https: // StackOverflow.it/questions/2703585/casting-datatypes-with-directcast-ctype-trycast) – Imad

risposta

151

La prima cosa da notare è che VB.NET non ha un meccanismo di trasmissione analogico diretto al C (type)instance. Ne parlo perché è utile usarlo come punto di partenza nel confronto tra i due operatori VB.NET (e sono operatori, non funzioni, anche se hanno semantica delle funzioni).

DirectCast() è più rigido dell'operatore di casting C#. Ti consente di eseguire il cast solo quando l'elemento da trasmettere è già il tipo di trasmissione. Non farà alcuna conversione. Pertanto, ad esempio, non puoi eseguire il cast da breve a int, ad esempio con un cast di C# (int). Ma è possibile eseguire il cast da un oggetto IEnumerable a un array, se la variabile dell'oggetto IEnumerable sottostante è in realtà un valore Array. E ovviamente puoi lanciare da Object a qualsiasi cosa, assumendo che il tipo l'istanza dell'oggetto sia davvero sotto il tuo cast nell'albero di ereditarietà.

Ciò è auspicabile perché ciò lo rende più veloce. C'è un po 'meno di conversione e controllo del tipo che deve aver luogo.

CType() è meno rigido dell'operatore di casting C#. Farà cose come convertire una stringa in un numero intero che non puoi fare con un semplice cast (int). Ha tutta la potenza di chiamare Convert.To___() in C#, dove ___ è il tipo di destinazione del cast. Ciò è auspicabile perché è molto potente, ma la potenza arriva al costo delle prestazioni — non è veloce come l'operatore di cast di DirectCast() o C# perché ci potrebbe essere molto lavoro da fare per finire il cast.

Generalmente si dovrebbe preferire DirectCast() quando è possibile.

Infine, hai perso un operatore di casting: TryCast(), che è un analogo diretto all'operatore as di C#.

+17

+1 Direi che la severità di 'DirectCast' è un altro vantaggio. Se commetti un errore, il compilatore ti dice immediatamente, ma con 'CType' un errore potrebbe solo causare occasionalmente un comportamento errato in fase di esecuzione, magari su qualche macchina utente con impostazioni regionali diverse. – MarkJ

+0

Ottima risposta. Quindi in ordine di complessità (da piccolo a grande): 'DirectCast',' TryCast', 'CType' /' Convert.ToXYZ() ',' C () 'sarebbe corretto? – motto

+2

@motto - chiudi. Le "funzioni" C () dovrebbero essere spostate più in alto nell'elenco, poiché sono realmente operatori anziché funzioni, anche se hanno una semantica delle funzioni. Per quei tipi che li hanno, sono molto vicini al cast di C# (type), ma faranno solo un po 'di lavoro in più. –

10

Con CType è possibile scrivere qualche cosa come questa Ctype("string",Integer). Ma con DirectCast l'istruzione sopra avrebbe dato errore di compilazione.

Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error 
Dim b As Integer = CType("1", Integer) 'Will compile 
0

DirectCast è molto più restrittivo di CType. Per esempio,

Sub Main() 
    Dim newint As Integer = DirectCast(3345.34, Integer) 
    Console.WriteLine(newint) 
    Console.ReadLine() 
End Sub 

tiri un errore. mostra anche nello studio visivo IDE. Ma

Sub Main() 
    Dim newint As Integer = CType(3345.34, Integer) 
    Console.WriteLine(newint) 
    Console.ReadLine() 
End Sub 

Vuol non genera un errore.