Quelles sont les caractéristiques de performance de la réflexion « est » en C# ?[dupliquer]

StackOverflow https://stackoverflow.com/questions/57701

  •  09-06-2019
  •  | 
  •  

Question

Cette question a déjà une réponse ici :

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.

Était-ce utile?

La solution

Il existe quelques options :

  1. Le casting classique: Foo foo = (Foo)bar
  2. Le as opérateur de casting: Foo foo = bar as Foo
  3. Le is test: bool is = bar is Foo

  1. Le casting classique il faut vérifier si bar peut être lancé en toute sécurité vers Foo (rapide), puis faites-le (plus lent) ou lancez une exception (très lent).
  2. Le as opérateur il faut vérifier si bar peut être lancé, alors faites le lancement, ou s'il ne peut pas être lancé en toute sécurité, alors il revient simplement null.
  3. Le is opérateur vérifie juste si bar peut être lancé sur Foo et renvoyer un boolean.

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 barest 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top