Differenza tra DirectCast () e CType () in VB.NET
-
27-09-2019 - |
Domanda
Sono un esperto C / C ++ / C # programmatore che ha appena ottenuto in VB.NET. Io generalmente uso CType (e CInt, CBool, CStr) per calchi, perché è meno caratteri ed è stato il primo modo di fusione, che mi è stato esposto a, ma sono consapevole del DirectCast e TryCast pure.
Semplicemente, ci sono delle differenze (effetto del cast, prestazioni, ecc) tra DirectCast e CType? Capisco l'idea di TryCast.
Soluzione
La prima cosa da notare è che VB.NET non ha un analogo diretto al meccanismo di C # 's (type)instance
casting. Io porto che fino perché è utile utilizzare che come un punto di partenza nel confronto tra i due operatori VB.NET (e sono gli operatori, non funzioni, anche se hanno una semantica funzione).
DirectCast()
è più rigorosa di quanto l'operatore C # casting. Esso consente solo di getto quando la voce di essere lanciato è già il tipo si sta lanciando a. Non farà alcuna conversione. Così, per esempio, non è possibile lanciare da breve a int, come si potrebbe con un cast C # (int)
. Ma si può lanciare da un oggetto IEnumerable a un array, se il variabile oggetto IEnumerable
sottostante è davvero un Array
. E, naturalmente, si può lanciare da Object a nulla, supponendo che il tipo di oggetto l'istanza è davvero da qualche parte sotto il tipo di cast l'albero di ereditarietà.
Questa è desiderabile perché questo rende più più veloce . C'è un po 'di conversione di meno e controllo dei tipi che deve avvenire.
CType()
è meno restrittiva delle all'operatore C # casting. Lo farà le cose come convertire una stringa in un numero intero che non si può fare solo con un cast semplice (int)
. Essa ha tanto potere come chiamare Convert.To___()
in C #, dove il ___ è il tipo di destinazione del cast. Questo è desiderabile perché è molto potente, ma che il potere viene al costo delle prestazioni -. Non è così veloce come DirectCast () o l'operatore C # s 'Cast perché ci potrebbe essere un bel po' di lavoro da fare per completare il cast
In generale si dovrebbe preferire DirectCast()
quando è possibile.
Infine, vi siete persi una fusione dell'operatore:. TryCast()
, che è un analogo diretto a C # 's operatore as
Altri suggerimenti
Con CType
è possibile scrivere qualche cosa come questo Ctype("string",Integer)
. Ma con DirectCast
la dichiarazione di cui sopra darebbe errore di tempo di compilazione.
Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
Dim b As Integer = CType("1", Integer) 'Will compile
DirectCast
è più restrittiva CType
.
Per esempio, questo genera un errore:
Sub Main()
Dim newint As Integer = DirectCast(3345.34, Integer)
Console.WriteLine(newint)
Console.ReadLine()
End Sub
Sarà anche mostrato nella IDE di Visual Studio.
Questo però, non genera un errore:
Sub Main()
Dim newint As Integer = CType(3345.34, Integer)
Console.WriteLine(newint)
Console.ReadLine()
End Sub