Je suis un programmeur C/C++/C # expérimenté qui vient de se lancer dans VB.NET. J'utilise généralement CType (et CInt, CBool, CStr) pour les conversions, car il s'agit d'un nombre inférieur de caractères et a été le premier moyen de diffusion auquel j'ai été exposé, mais je connais aussi DirectCast et TryCast.
Existe-t-il simplement des différences (effet de la distribution, des performances, etc.) entre DirectCast et CType? Je comprends l'idée de TryCast.
La première chose à noter est que VB.NET n’a pas d’analogue direct avec le mécanisme de casting (type)instance
De C #. J'en parle parce qu'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 strict que l'opérateur de diffusion C #. Il ne vous permet de lancer que lorsque l'élément en cours de diffusion est déjà le type que vous lancez. Cela ne fera aucune conversion. Ainsi, par exemple, vous ne pouvez pas lancer de short à int, comme avec un casting C # (int)
. Mais vous pouvez transtyper un IEnumerable vers un tableau si votre variable d'objet IEnumerable
sous-jacente est réellement un Array
. Et bien sûr, vous pouvez transtyper d'objet en n'importe quoi, en supposant que le type de votre instance d'objet se trouve réellement quelque part en dessous de votre type de transtypage dans l'arborescence d'héritage.
Ceci est souhaitable car cela le rend plus rapide. Il faut un peu moins de conversion et de vérification de type.
CType()
est moins strict que l'opérateur de diffusion C #. Cela fera des choses comme convertir une chaîne en un entier que vous ne pouvez pas faire avec un simple casting (int)
. Il a autant de pouvoir que d'appeler Convert.To___()
en C #, où ___ est le type de cible de votre distribution. Ceci est souhaitable car il est très puissant, mais ce pouvoir 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 peut s’avérer 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 #.
Avec CType
, vous pouvez écrire quelque chose comme ceci Ctype("string",Integer)
. Mais avec DirectCast
, la déclaration 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
DirectCast
est plus restrictif que CType
.
Par exemple, cela jettera une erreur:
Sub Main()
Dim newint As Integer = DirectCast(3345.34, Integer)
Console.WriteLine(newint)
Console.ReadLine()
End Sub
Il sera également affiché dans l'IDE de Visual Studio.
Ceci ne jette toutefois pas une erreur:
Sub Main()
Dim newint As Integer = CType(3345.34, Integer)
Console.WriteLine(newint)
Console.ReadLine()
End Sub