Quelles sont les caractéristiques de performance de la réflexion « est » en C# ?[dupliquer]
-
09-06-2019 - |
Question
Cette question a déjà une réponse ici :
- C# "est" la performance de l'opérateur 8 réponses
C'est montré que le casting « comme » est beaucoup plus rapide que le casting de préfixe, mais qu'en est-il de la réflexion « est » ?À quel point est-ce grave ?Comme vous pouvez l'imaginer, la recherche de « est » sur Google n'est pas très efficace.
La solution
Il existe quelques options :
- Le casting classique:
Foo foo = (Foo)bar
- Le
as
opérateur de casting:Foo foo = bar as Foo
- Le
is
test:bool is = bar is Foo
- Le casting classique il faut vérifier si
bar
peut être lancé en toute sécurité versFoo
(rapide), puis faites-le (plus lent) ou lancez une exception (très lent). - Le
as
opérateur il faut vérifier sibar
peut être lancé, alors faites le lancement, ou s'il ne peut pas être lancé en toute sécurité, alors il revient simplementnull
. - Le
is
opérateur vérifie juste sibar
peut être lancé sur Foo et renvoyer unboolean
.
Le is
Le test est rapide, car il ne réalise que la première partie d'une opération de coulée complète.Le as
L'opérateur est plus rapide qu'un casting classique car il ne lève pas d'exception si le casting échoue (ce qui le rend idéal pour les situations où vous vous attendez légitimement à ce que le casting puisse échouer).
Si vous avez juste besoin de savoir si la variable bar
est un Foo
puis utilisez le is
opérateur, MAIS, si vous allez tester si bar
est un Foo
, et si oui, puis lance-le, alors vous devriez utiliser le as
opérateur.
Essentiellement, chaque casting doit faire l'équivalent d'un is
vérifier en interne dans un premier temps, afin de s'assurer que le casting est valide.Donc si tu fais un is
contrôle suivi d'un plâtre complet (soit un as
cast, ou avec l'opérateur de cast classique), vous effectuez effectivement le is
vérifiez deux fois, ce qui représente une légère surcharge supplémentaire.
Autres conseils
La façon dont je l'ai appris est la suivante :
if (obj is Foo) {
Foo f = (Foo)obj;
f.doSomething();
}
est plus lent que ceci :
Foo f = obj as Foo;
if (f != null) {
f.doSomething();
}
Est-ce assez lent pour avoir de l'importance ?Probablement pas, mais c'est une chose si simple à laquelle il faut prêter attention, autant le faire.
"is" est fondamentalement équivalent à l'opérateur IL "isinst" - que cet article décrit comme étant rapide.
Cela devrait être assez rapide pour ne pas avoir d'importance.Si vous vérifiez suffisamment le type d'un objet pour qu'il ait un impact notable sur les performances, vous devez repenser votre conception.