2010-04-24 8 views
39

Da quando mi sono trasferito da VB6 a VB.NET da qualche parte nel 2005, ho utilizzato CType per eseguire il casting da un tipo di dati a un altro. Lo faccio perché è semplicemente più veloce da digitare, utilizzato per esistere in VB6 e non so perché devo usare DirectCast se non c'è apparentemente alcuna differenza tra loro.Casting DataTypes con DirectCast, CType, TryCast

Io uso TryCast una volta ogni tanto perché capisco che a volte il casting può fallire. Tuttavia, non riesco a ottenere la differenza tra CType e DirectCast.

Qualcuno può dirmi la differenza in semplice inglese semplice che differenza tra i due (CType e DirectCast)? Aggiungere esempi di dove usare ciò che sarebbe utile.

Grazie.

+0

possibile duplicato del [Differenza tra DirectCast() e CType() in VB.Net] (http://stackoverflow.com/questions/3056514/difference-between-directcast-and-ctype-in -vb-net) – RMalke

+4

@RMalke: La mia domanda è stata posta prima della [domanda duplicata] collegata (http://stackoverflow.com/q/3056514). Ciò è corroborato dal [commento di MarkJ] (http://stackoverflow.com/posts/comments/3138442). Inoltre, la risposta accettata qui spiega il cast di 'CType' in dettaglio, qualcosa in cui la risposta accettata sull'altra domanda non va veramente a finire. Se mai, credo che sia l'altro che deve essere chiuso o altrimenti collegato a questo. –

risposta

51

TryCast e DirectCast sono operatori di casting che si mappano direttamente al supporto CLR per il casting. Possono eseguire rapidamente il cast di un oggetto di un tipo di base su un tipo derivato o unbox di un valore di un tipo di valore. DirectCast genera un'eccezione quando il cast non è possibile, TryCast restituisce Nothing se non è riuscito. In genere si desidera favorire DirectCast per rilevare errori di programmazione.

CType consente un superset di conversioni, quelle su cui CLR aggrotta la fronte. L'esempio migliore che riesco a pensare è convertire una stringa in numero o data. Per esempio:

Dim obj As Object 
obj = "4/1/2010" 
Dim dt As DateTime = CType(obj, DateTime) 

Quale dovrete usare se Option Strict On è a tutti gli effetti. Se è spento, allora si può fare direttamente:

Option Strict Off 
... 
    Dim dt As DateTime = obj 

Molto comodo di corso e di una parte dell'eredità di VB.NET come un linguaggio tipizzato in modo dinamico. Ma non senza problemi, quella data è Unicorn day su stackoverflow.com ma sarà un giorno di gennaio quando un inglese entrerà nella stringa. Le conversioni inaspettate sono la ragione per cui il CLR non le consente direttamente. Il, mai una conversione esplicita sorpresa si presenta così:

Dim dt As DateTime = DateTime.Parse(obj.ToString(), _ 
    System.Globalization.CultureInfo.GetCultureInfo("en-US").DateTimeFormat) 

se si dovrebbe comprare in try/DirectCast vs CType vs conversioni esplicite è piuttosto una scelta personale. Se ora programmi con Option Strict On, dovresti iniziare a utilizzare Try/DirectCast. Se preferisci il linguaggio VB.NET perché ti piace la praticità della digitazione dinamica, non esitare a rimanere su CType.

15

DirectCast è due volte più veloce per i tipi di valori (numeri interi ... ecc.), Ma identici per i tipi di riferimento.

Per ulteriori informazioni consultare la sezione "Funzioni di conversione, CType, DirectCast e System.Convert" nella pagina MSDN this.

+0

Il link che hai fornito contiene un'ottima documentazione. Grazie mille. –

1

Questo page lo spiega bene.

Leggendolo, penso che quando si utilizza DirectCast, si sia certi che la conversione funzionerà senza restringimento o espansione (in questo caso, dati numerici). Considerando che, CType proverà a convertirsi ad esso, con lo sviluppatore consapevole del restringimento/espansione.

+3

È quel tipo di runtime e il tipo specificato che non capisco. Se dichiaro un doppio, mi aspetto che il casting esplicito su un numero intero funzioni. Com'è quindi che CType è in grado di farlo perfettamente e DirectCast no. Mi manca qualcosa qui? Semplicemente inglese per favore ... –

0

Per "conversione" si intende la conversione di un tipo di dati in un altro (ad esempio stringa in intero, decimale in numero intero, oggetto in stringa, ecc.).

Con "cast" si intende la modifica di un tipo di oggetto in un altro tipo che è ad esso correlato da una delle seguenti regole.

http://www.thedevheaven.com/2012/09/directcast-vs-ctype.html