Double Possible:
Comment onéreux .NET réflexion?Je suis actuellement dans une programmation mentalité que la réflexion est mon meilleur ami. Je l'utilise beaucoup pour le chargement dynamique de contenu qui permet de "lâche mise en œuvre" plutôt qu'une stricte des interfaces, ainsi que beaucoup d'attributs personnalisés.
Qu'est-ce que le "vrai" coût de l'utilisation de la réflexion?
Est-il en vaut la peine pour souvent reflétée types sont mis en cache, la réflexion, comme notre propre pré-LINQ DAL code objet sur toutes les propriétés à la table des définitions?
Serait la mise en cache de la mémoire outwieght le reflet d'utilisation de l'UC?
Réponses
Trop de publicités?La réflexion nécessite une grande quantité de métadonnées de type à être chargé et ensuite traitées. Cela peut entraîner une plus grande charge de la mémoire et plus lent à l'exécution. Selon cet article, les modifications de propriétés est d'environ 2,5 x-3x plus lent et l'invocation de méthode est de 3,5 x-4x plus lente.
Voici un excellent article de MSDN expliquant comment prendre le temps de réfléchir plus vite et où la surcharge est. Je vous recommande vivement de lire si vous voulez en savoir plus.
Il est également un élément de complexité de la réflexion ajouter le code qui rend ce beaucoup plus déroutant et donc difficile à travailler. Certaines personnes, comme Scott, Hanselman croire que par l'aide de la réflexion vous faites souvent plus de problèmes que de les résoudre. C'est particulièrement le cas si vos équipes est principalement junior devs.
Vous pouvez être mieux à la recherche dans le DLR (Dynamic Language Runtime) si vous avez besoin de beaucoup de comportement dynamique. Avec les nouveaux changements à venir .NET 4.0, vous voudrez peut-être voir si vous pouvez incorporer dans votre solution. L'ajout du support pour les dynamiques à partir de VB et C# faire à l'aide de code dynamique, très élégant et à la création de vos propres objets dynamiques assez simple.
Bonne chance.
EDIT: j'ai fait un peu plus de fouiller Scott site et trouvé ce podcast sur la réflexion. Je n'ai pas écouté, mais il pourrait être la peine.
Il y a beaucoup de choses que vous pouvez faire pour accélérer la réflexion. Par exemple, si vous faites beaucoup de bien-accès, puis HyperDescriptor pourrait être utile.
Si vous faites beaucoup de la méthode invoke, alors vous pouvez mettre en cache les méthodes tapé les délégués à l'aide Delegate.CreateDelegate
- ce alors à la vérification de type, etc une seule fois (lors d' CreateDelegate
).
Si vous faites beaucoup de la construction de l'objet, alors Delegate.CreateDelegate
n'aide pas (vous ne pouvez pas l'utiliser sur un constructeur) - mais (3,5) Expression
peut être utilisé pour ce faire, encore une fois la compilation d'un typée délégué.
Donc oui: la réflexion est lent, mais vous pouvez l'optimiser sans trop de douleur.
Avec un grand pouvoir vient une grande responsabilité.
Comme vous le dites, de réflexion a aussi, des coûts, et en fonction de la façon dont beaucoup de réflexion que vous faites, il peut ralentir l'application vers le bas de manière significative.
L'un des très approrpiate lieux à utilisation c'est pour IoC (Inversion of Control) car, en fonction de la taille de votre application, aurait probablement plus d'avantages que de pas.
Merci pour les bons liens et les commentaires, surtout de la part de la gare Jr de Devs, qui a frappé à droite sur l'argent.
Pour nous, il est plus facile pour nos juniors développeurs pour ce faire:
[TableName("Table")]
public class SomeDal : BaseDal
{
[FieldName("Field")]
public string Field
}
plutôt que de certaines grandes impelementations de DAL. Cela accélère leur construction de la DAL objets, tout en cachant tous les rouages internes pour les anciens développeurs de l'intestin.
Dommage que LINQ n'est pas venu plus tôt, je me sens à la fois, nous avons écrit que la moitié.
Une chose qui peut parfois vous mordre lors de l'utilisation de la réflexion n'est pas de mise à jour des appels à l'aide de la réflexion lors de refactoring. Des outils comme resharper vous invite à mettre à jour les commentaires et les chaînes de caractères lorsque vous modifiez un nom de méthode, de sorte que vous pouvez attraper le plus de cette façon, mais quand vous êtes en appelant les méthodes qui ont été générées de façon dynamique ou le nom de la méthode a été généré dynamiquement, vous risquez de manquer quelque chose.
La seule solution est une bonne documentation approfondie et des tests unitaires.