J'ai remarqué qu'en traitant des expressions ou des arbres d'expression, j'utilise beaucoup la réflexion pour définir et obtenir des valeurs dans les propriétés et ce que vous avez. Il m'est venu à l'esprit que l'utilisation de la réflexion semble devenir de plus en plus courante. Des choses comme DataAnotations pour validation, attributs ORM de lourds, etc. me reste à se demander: Qu'est - ce qui a changé depuis les jours il y a des années et des années quand je l' habitude d'être dit d'éviter la réflexion , si possible?
Alors quoi, si quelque chose a changé? Est-ce juste la vitesse des machines? Y a-t-il eu des changements dans le cadre pour accélérer la réflexion?
Ou rien n'a vraiment changé? Est-il toujours "mauvais" ou "lent" d'utiliser la réflexion?
la source
Réponses:
La réflexion n'est ni mauvaise, ni lente. C'est simplement un outil. Comme tous les outils, il est très précieux pour certains scénarios, pas aussi précieux pour d'autres.
Si les performances sont vraiment un problème, vous pouvez toujours utiliser une bibliothèque comme FasterFlect .
Lectures complémentaires
Si la réflexion est inefficace, quand est-elle la plus appropriée?
la source
dynamic
- apparemment un ordre de grandeur plus rapide que la réflexion.La raison pour laquelle les gens hésitent à utiliser la réflexion inutilement n'est pas la performance: oui, il y a un surcoût à utiliser la réflexion, mais souvent, résoudre le problème sans cela nécessite une approche différente avec une complexité comparable, et même si ce n'est pas le cas, le surcoût est rarement significatif (en particulier pour le développement au niveau de l'application).
À l'aide de la réflexion, certaines hypothèses importantes que l'on peut normalement émettre à propos du code source sont rompues et les outils tels que «Rechercher toutes les références» cessent de fonctionner de manière fiable. La réflexion supprime également la plupart de la sécurité de type que le compilateur applique en C #, par exemple, et la plupart des erreurs de programmation qu'un système de type intercepterait et traduirait normalement en erreurs de compilation, deviennent maintenant des erreurs d'exécution au mieux ou des bogues très obscurs au pire.
Alors pourquoi les gens utilisent-ils la réflexion? Autrement dit, car malgré les problèmes décrits ci-dessus, c'est un outil très précieux. Avec la réflexion, certains des avantages de la programmation dynamique peuvent être obtenus dans un langage statique et strictement typé comme C #, et les langages de programmation dynamiques ont récemment montré leurs mérites, en particulier dans le domaine de la programmation Web - PHP, Javascript et Python bien en évidence. , tous utilisent la frappe dynamique et se sont révélés être de bons ajustements pour la programmation Web. Mais comme le langage est toujours C #, vous pouvez choisir de conserver la plupart de votre application dans un idiome OOP strictement typé et d'écrire la petite partie où le comportement dynamique fait vraiment une différence avec la réflexion.
Un exemple typique est lorsque vous devez exposer des méthodes en tant qu'appels de service Web (en utilisant un protocole non encore intégré à .NET). L'approche OOP strictement typée fonctionne, mais elle est trop restrictive et maladroite. Mais si vous utilisez la réflexion pour mapper les appels aux méthodes et les paires clé / valeur aux arguments, vous pouvez écrire une fois la plomberie d'un tel service Web, puis l'utiliser sur n'importe quelle classe de votre choix.
la source
La réflexion est encore beaucoup plus lente que les appels directs. Deux choses ont changé:
Ensemble, ces deux facteurs ont réduit le coût de la réflexion au point où vous pouvez l'utiliser régulièrement (le cas échéant à partir d'un PDV de maintenabilité) et attendre que le profileur vous dise s'il s'agit réellement d'un goulot d'étranglement (et soyez raisonnablement sûr que la plupart des le temps qu'il ne sera pas).
la source