Différence entre DirectCast () et CType () dans VB.NET

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 casts car il y a moins de caractères et la première méthode de diffusion à laquelle j’ai été exposé, mais je connais aussi DirectCast et TryCast.

Simplement, existe-t-il des différences (effet de dissortingbution, performance, 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’analogique direct avec le mécanisme de transtypage de l’ (type)instance C #. Je soulève cette question car il est utile de l’utiliser comme sharepoint 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 ssortingct que l’opérateur de casting C #. Il vous permet uniquement de lancer lorsque l’object en cours de lancement est le type auquel vous jouez. Il ne fera aucune conversion. Ainsi, par exemple, vous ne pouvez pas passer de court à int, comme vous pouvez le faire avec une dissortingbution C # (int) . Mais vous pouvez convertir un object IEnumerable en un tableau, si votre variable d’object IEnumerable sous-jacente est vraiment un Array . Et bien sûr, vous pouvez convertir l’object en n’importe quoi, en supposant que le type de votre instance d’object se trouve quelque part en dessous de votre type de dissortingbution dans l’arborescence d’inheritance.

Ceci est souhaitable car cela le rend plus rapide . Il y a un peu moins de conversion et de vérification de type à effectuer.

CType() est moins ssortingct que l’opérateur de casting C #. Il fera des choses comme convertir une chaîne en un entier que vous ne pouvez pas faire avec une simple dissortingbution (int) . Il a autant de puissance que d’appeler Convert.To___() en C #, où ___ est le type de cible de votre dissortingbution. Cela est souhaitable car il est très puissant, mais cette puissance se fait au désortingment de la performance – ce n’est pas aussi rapide que l’opérateur de dissortingbution DirectCast () ou C # car il pourrait y avoir beaucoup de travail à faire pour terminer la dissortingbution.

En règle générale, 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 à l’opérateur C #.

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

  Dim a As Integer = DirectCast("1", Integer) 'Gives comstackr error Dim b As Integer = CType("1", Integer) 'Will comstack 

DirectCast est plus ressortingctif que CType .

Par exemple, cela provoquera 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.

Cela ne provoque cependant pas d’erreur:

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