2009-08-13 6 views
10

Je voudrais savoir si l'utilisation des attributs dans .Net, en particulier C#, est chère, et pourquoi ou pourquoi pas?Cette utilisation des attributs dans .Net (C#) est-elle coûteuse?

Je pose spécifiquement la question de C#, à moins qu'il n'y ait aucune différence entre les différents langages .Net (parce que les bibliothèques de classes de base sont les mêmes?). Toutes les nouvelles technologies .Net font un usage intensif des attributs, tels que Linq to SQL, ASP.Net MVC, WCF, Enterprise Library, etc, et je me demandais quel effet cela aurait sur les performances. Beaucoup de classes sont automatiquement décorées avec certains attributs, ou ces attributs sont requis pour certaines fonctionnalités. Est-ce que la question de la dépense dépend des détails spécifiques à la mise en œuvre? Comment les attributs sont-ils compilés en IL? Sont-ils mis en cache automatiquement, ou est-ce à la hauteur de l'implémenteur?

+3

Il n'existe aucune différence entre un langage .NET qui s'exécute sur le CLR. Je ne sais pas comment le DLR s'intègre dans l'image, mais une fois compilé, C# et VB.NET (et tout autre langage CLR) sont les mêmes. –

Répondre

19

"L'utilisation des attributs" est trop vague. Récupérer les attributs est une opération de réflexion efficace - vous ne voudriez pas le faire régulièrement en boucle - mais ils ne sont pas chers à inclure dans les métadonnées, et le modèle d'utilisation typique (IMO) consiste à construire une autre représentation (par exemple un schéma en mémoire) après avoir lu les attributs une fois.

Il se peut qu'il y ait un cache en jeu, mais je mettrais probablement en cache l'autre représentation de toute façon. Par exemple, si je décorais des valeurs enum avec des descriptions, j'obtiendrais généralement les attributs une fois pour construire une chaîne de dictionnaire enum (ou vice versa).

+0

Pensez-vous que l'on peut sans risque supposer que les attributs (ou une certaine représentation d'entre eux) qui font partie du .Net BCL et d'autres Microsoft Frameworks/addons, sont mis en cache? –

+1

Encore une fois, c'est un peu vague. Si vous pouvez donner un exemple très précis et comment on peut déterminer s'ils sont mis en cache, il serait plus raisonnable de répondre à cette question. –

6

Cela dépend de la manière dont vous les utilisez ... Certains attributs sont fournis à titre d'information (ObsoleteAttribute par exemple), ils n'ont donc aucun impact sur les performances d'exécution. D'autres attributs sont utilisés par le compilateur (comme DllImportAttribute) ou par des post-compilateurs comme PostSharp, donc le coût est au moment de la compilation, pas au moment de l'exécution. Cependant, si vous utilisez la réflexion pour inspecter les attributs lors de l'exécution, cela peut être coûteux.