2010-06-16 7 views
84

Je suis un programmeur C/C++/C# expérimenté qui vient d'entrer dans VB.NET. J'utilise généralement CType (et CInt, CBool, CStr) pour les lancers car il s'agit de moins de caractères et c'était la première façon de lancer à laquelle j'étais exposé, mais je suis également au courant de DirectCast et TryCast.Différence entre DirectCast() et CType() dans VB.NET

Simplement, existe-t-il des différences (effet de conversion, performance, etc.) entre DirectCast et CType? Je comprends l'idée de TryCast.

+6

double exact de ce casting de * DataTypes avec DirectCast, CType, TryCast * http://stackoverflow.com/questions/2703585/casting-datatypes-with-directcast-ctype-trycast – MarkJ

+1

double possible de [Coulée DataTypes avec DirectCast, CType, TryCast] (https: // stackoverflow.com/questions/2703585/casting-datatypes-avec-directcast-ctype-trycast) – Imad

Répondre

151

La première chose à noter est que VB.NET n'a pas d'analogue direct au mécanisme de coulée (type)instance de C#. Je soulève cela car il est utile de l'utiliser comme point de départ pour comparer les deux opérateurs VB.NET (et ce sont des opérateurs, pas des fonctions, même s'ils ont une sémantique de fonction).

DirectCast() est plus stricte que l'opérateur de coulée C#. Il ne vous permet de lancer que lorsque l'élément en cours de diffusion est déjà le type que vous utilisez. Il ne fera aucune conversion. Ainsi, par exemple, vous ne pouvez pas passer de court à int, comme vous le feriez avec une distribution C# (int). Mais vous pouvez passer d'un IEnumerable à un tableau, si votre variable objet IEnumerable sous-jacente est vraiment Array. Et bien sûr, vous pouvez passer d'un objet à n'importe quoi, en supposant que le type de votre instance d'objet se trouve réellement en dessous de votre type de cast dans l'arbre d'héritage.

Ceci est souhaitable car cela le rend plus rapide . Il y a un peu moins de conversion et de vérification de type qui doit avoir lieu.

CType() est moins stricte que l'opérateur de coulée C#. Il va faire des choses comme convertir une chaîne en un nombre entier que vous ne pouvez pas faire avec un simple (int) cast. Il a autant de pouvoir que d'appeler Convert.To___() en C#, où le ___ est le type cible de votre distribution. Ceci est souhaitable car il est très puissant, mais cette puissance se fait au détriment des performances. Ce n'est pas aussi rapide que l'opérateur de distribution de DirectCast() ou C# car il pourrait y avoir beaucoup de travail à faire pour terminer la distribution.

Généralement, vous devriez préférer DirectCast() lorsque vous le pouvez. Enfin, vous avez manqué un opérateur de casting: TryCast(), qui est un analogue direct de l'opérateur as de C#.

+17

+1 Je dirais que la rigueur de 'DirectCast' est un autre avantage. Si vous faites une erreur, le compilateur vous le dit immédiatement, mais avec 'CType', une erreur peut simplement causer un mauvais comportement au moment de l'exécution - peut-être sur une machine utilisateur avec des paramètres régionaux différents. – MarkJ

+0

Bonne réponse. Donc dans l'ordre de complexité (petit à grand): 'DirectCast',' TryCast', 'CType' /' Convert.ToXYZ() ',' C () 'serait correct? – motto

+2

@motto - fermer. Les fonctions C () doivent être déplacées plus haut dans la liste, car ce sont vraiment des opérateurs plutôt que des fonctions, même si elles ont une sémantique de fonction. Pour les types qui en ont, ils sont très proches du casting de C# (type), mais feront un peu plus de travail. –

10

Avec CType vous pouvez écrire quelque chose comme ceci Ctype("string",Integer). Mais avec DirectCast l'instruction ci-dessus donnerait une erreur de compilation.

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

DirectCast est beaucoup plus restrictif que CType. Par exemple,

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

génère une erreur. ça se voit dans le studio visuel IDE aussi. Mais

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

Est-ce pas renvoie une erreur.