Le casting est le processus de convertir un type de données en un autre, par exemple, d'un type Integer en un type String. Certaines opérations en VB.NET nécessitent des types de données spécifiques pour fonctionner. La diffusion crée le type dont vous avez besoin. Le premier article de cette série en deux parties, Casting et conversions de types de données dans VB.NET, présente le casting. Cet article décrit les trois opérateurs que vous pouvez utiliser pour caster VB.NET - DirectCast, CType et TryCast - et compare leurs performances.
Les performances sont l'une des grandes différences entre les trois opérateurs de casting selon Microsoft et d'autres articles. Par exemple, Microsoft fait généralement attention à avertir que "DirectCast... peut fournir des performances légèrement meilleures que CType lors de la conversion vers et depuis le type de données Object. "(Je souligne.)
J'ai décidé d'écrire du code pour vérifier.
Mais d'abord un mot de prudence. Dan Appleman, l'un des fondateurs de l'éditeur de livres techniques Apress et un technicien fiable gourou, m'a dit une fois que la performance de référence est beaucoup plus difficile à faire correctement que la plupart des gens prendre conscience de. Il existe des facteurs tels que les performances de la machine, d'autres processus qui peuvent s'exécuter en parallèle, l'optimisation comme la mise en cache de la mémoire ou l'optimisation du compilateur, et des erreurs dans vos hypothèses sur ce qu'est réellement le code Faire. Dans ces tests, j'ai essayé d'éliminer les erreurs de comparaison "pommes et oranges" et tous les tests ont été exécutés avec la version finale. Mais il pourrait toujours y avoir des erreurs dans ces résultats. Si vous en remarquez, faites-le moi savoir.
Les trois opérateurs de casting sont:
- DirectCast
- CType
- TryCast
En pratique, vous constaterez généralement que les exigences de votre application détermineront l'opérateur que vous utiliserez. DirectCast et TryCast ont des exigences très étroites. Lorsque vous utilisez DirectCast, le type doit déjà être connu. Bien que le code ...
theString = DirectCast (theObject, String)
... sera compilé avec succès si l'objet n'est pas déjà une chaîne, alors le code lèvera une exception d'exécution.
TryCast est encore plus restrictif car il ne fonctionnera pas du tout sur les types de "valeur" tels que Integer. (La chaîne est un type de référence. Pour plus d'informations sur les types de valeur et les types de référence, consultez le premier article de cette série.) Ce code ...
theInteger = TryCast (theObject, Integer)
... ne compilera même pas.
TryCast est utile lorsque vous n'êtes pas sûr du type d'objet avec lequel vous travaillez. Plutôt que de lancer une erreur comme DirectCast, TryCast ne renvoie rien. La pratique normale consiste à tester Nothing après avoir exécuté TryCast.
Seul CType (et les autres opérateurs "Convertir" comme CInt et CBool) convertira les types qui n'ont pas de relation d'héritage comme un entier en une chaîne:
Dim theString As String = "1" Dim theInteger As Integer. theInteger = CType (theString, Integer)
Cela fonctionne car CType utilise des "fonctions d'assistance" qui ne font pas partie du .NET CLR (Common Language Runtime) pour effectuer ces conversions.
Mais rappelez-vous que CType lèvera également une exception si la chaîne ne contient pas quelque chose qui peut être converti en entier. S'il y a une possibilité que la chaîne ne soit pas un entier comme celui-ci ...
Dim theString As String = "George"
... alors aucun opérateur de casting ne fonctionnera. Même TryCast ne fonctionnera pas avec Integer car il s'agit d'un type de valeur. Dans un cas comme celui-ci, vous devez utiliser la vérification de validité, telle que l'opérateur TypeOf, pour vérifier vos données avant d'essayer de les caster.
La documentation de Microsoft pour DirectCast mentionne spécifiquement la diffusion avec un type d'objet, c'est donc ce que j'ai utilisé dans mon premier test de performances. Les tests commencent à la page suivante!
DirectCast utilise généralement un type d'objet, c'est donc ce que j'ai utilisé lors de mon premier test de performances. Pour inclure TryCast dans le test, j'ai également inclus un bloc If car presque tous les programmes qui utilisent TryCast en auront un. Dans ce cas, cependant, il ne sera jamais exécuté.
Voici le code qui compare les trois lors de la conversion d'un objet en chaîne:
Atténuer l'heure en tant que nouveau chronomètre () Dim theString As String. Dim theObject As Object = "An Object" Dim theIterations As Integer = CInt (Itérations. Texte) * 1000000. ' «Test DirectCast. le temps. Début() Pour i = 0 Aux itérations. theString = DirectCast (theObject, String) Prochain. le temps. Arrêtez() DirectCastTime. Texte = le temps. ElapsedMilliseconds. ToString. ' «Test CType. le temps. Redémarrer() Pour i As Integer = 0 Aux itérations. theString = CType (theObject, String) Prochain. le temps. Arrêtez() CTypeTime. Texte = le temps. ElapsedMilliseconds. ToString. ' «TryCast Test. le temps. Redémarrer() Pour i As Integer = 0 Aux itérations. theString = TryCast (theObject, String) Si la chaîne n'est rien alors. MsgBox ("Cela ne devrait jamais s'afficher") Fin si. Prochain. le temps. Arrêtez() TryCastTime. Texte = le temps. ElapsedMilliseconds. ToString.
Ce premier test semble montrer que Microsoft est en plein dans le mille. Voici le résultat. (Les expériences avec des nombres d'itérations plus grands et plus petits ainsi que des tests répétés dans différentes conditions n'ont montré aucune différence significative par rapport à ce résultat.)
Cliquez ici pour afficher l'illustration
DirectCast et TryCast étaient similaires à 323 et 356 millisecondes, mais CType a pris trois fois plus de temps à 1018 millisecondes. Lorsque vous convertissez des types de référence comme celui-ci, vous payez pour la flexibilité de CType dans les performances.
Mais ça marche toujours comme ça? L'exemple Microsoft dans leur page pour DirectCast est principalement utile pour vous dire ce que habitude travailler en utilisant DirectCast, pas ce qui va. Voici l'exemple de Microsoft:
Dim q As Object = 2,37. Dim i As Integer = CType (q, Integer) 'La conversion suivante échoue au moment de l'exécution. Dim j As Integer = DirectCast (q, Integer) Dim f comme nouveau système. Les fenêtres. Formes. Forme. Dim c As System. Les fenêtres. Formes. Contrôle. 'La conversion suivante réussit. c = DirectCast (f, système. Les fenêtres. Formes. Contrôle)
En d'autres termes, vous ne peut pas utilisez DirectCast (ou TryCast, bien qu'ils ne le mentionnent pas ici) pour convertir un type d'objet en un type entier, mais vous pouvez utilisez DirectCast pour convertir un type de formulaire en type de contrôle.
Vérifions les performances de l'exemple de Microsoft sur ce que volonté travailler avec DirectCast. En utilisant le même modèle de code indiqué ci-dessus, remplacez ...
c = DirectCast (f, système. Les fenêtres. Formes. Contrôle)
... dans le code avec des substitutions similaires pour CType et TryCast. Les résultats sont un peu surprenants.
Cliquez ici pour afficher l'illustration
DirectCast était en fait le plus lent des trois choix avec 145 millisecondes. CType est juste un peu plus rapide à 127 millisecondes mais TryCast, y compris un bloc If, est le plus rapide à 77 millisecondes. J'ai aussi essayé d'écrire mes propres objets:
Classe ParentClass... Fin de classe. Classe ChildClass. Hérite de ParentClass... Fin de classe.
J'ai obtenu des résultats similaires. Il semble que si vous êtes ne pas lancer un type d'objet, vous êtes mieux ne pas en utilisant DirectCast.