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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top