Quelle est la différence entre RuntimeTypeHandle et Type ?
-
09-06-2019 - |
Question
Et pourquoi devrais-je utiliser l’un plutôt que l’autre dans mon code ?
La solution
Prudence:Cette réponse semble obsolète. Il a été publié avant que .NET 4 ne soit disponible, ce qui a apparemment introduit quelques optimisations concernant
Type
et a ainsi rendu les informations contenues dans cette réponse obsolètes.Voir cette réponse plus récente pour plus de détails.
Selon ce billet de blog (de 2006) de Vance Morrison, RuntimeTypeHandle
est un type valeur (struct
) qui encapsule un pointeur non géré, donc Type.GetTypeHandle(obj).Equals(anotherHandle)
est plus rapide à utiliser pour des comparaisons strictes "est exactement du même type" que obj.GetType().Equals(anotherType)
— ce dernier crée System.Type
cas qui sont, apparemment, plus lourds.
Cependant, c'est également moins évident et relève définitivement de la catégorie "micro-optimisation", donc si vous vous demandez quand vous avez besoin de l'un plutôt que de l'autre, vous devriez probablement simplement utiliser System.Type.
Autres conseils
Dans .NET 4.0 bêta 1 RuntimeTypeHandle
vient juste d'envelopper RuntimeType
.Il semble que tous les avantages de l'utiliser comme produit bon marché Type
le proxy est parti.
Preuve de l'affirmation ci-dessus :
- de Microsoft Source de référence pour le
System.RuntimeTypeHandle
taper montre que ce type n'est en effet qu'un wrapper autourSystem.RuntimeType
ces jours. - Article du blog 2013 de Sandro Magi « CLR :Le coût des tests de type dynamiques" contient un benchmark et une note finale montrant que les bénéfices supposés en termes de performances de
RuntimeTypeHandle
ont disparu dans .NET 4.