2010-03-24 9 views
8

J'ai lu des didacticiels sur le Web à propos des attributs C# et des métadonnées. C'est très cool mais je me demande son implication.Implémentation des attributs C# et des métadonnées

  1. Les attributs (personnalisés) sont-ils chargés lors du chargement de l'assembly? ou est-ce seulement lorsque vous utilisez la réflexion pour récupérer les métadonnées?

  2. Il semble que les attributs ajoutent au total de la taille du code, car il est compilé dans l'exécutable? Est-ce correct?

  3. Est-il possible d'avoir des attributs de compilation? C'est à dire. les attributs ne seront appliqués que si DEBUG est défini?

Je sais que l'un est de faire comme ceci:

#if DEBUG 
[MyCustomAttribute] 
#endif 

Mais je me demande s'il y a une meilleure façon?

  1. Existe-t-il des problèmes de performances/mémoire lors de l'utilisation d'un grand nombre d'attributs? Ma plate-forme cible sera la Xbox 360 (en utilisant C#/XNA).

Merci!

-Stephanus

Répondre

6

Il existe deux parties aux attributs, leur code et leur argument constructeur et leurs données de propriété. Le code est stocké dans l'IL de l'assembly, les données sont stockées dans les métadonnées de l'assembly. Si un attribut n'est pas utilisé, cela ne prend que de l'espace mémoire virtuel mais ne nécessite aucune ressource machine.

Rien ne se produit tant que vous n'avez pas utilisé la méthode GetCustomAttributes(). Ensuite, le code de la classe d'attributs est compilé juste à temps, tout comme le code normal de votre assembly. Et le constructeur et les setters de propriété sont appelés, en utilisant les données d'attribut dans les métadonnées.Vous utiliserez de la RAM pour les deux lorsque le gestionnaire de mémoire mappe l'IL, le code machine et les pages de métadonnées.

4

1) __gVirt_NP_NNS_NNPS<__ attributs afaik sont instanciés-paresseux, mais ils viennent avec l'ensemble dans la mémoire.
2) Pas assez près pour s'inquiéter. Knuth, etc.
3) Oui. Utiliser les attributs signifie utiliser la réflexion, qui fait partie des choses les plus lentes que vous pouvez faire dans le cadre. Mais alors, est-ce trop lent pour votre application? Sans savoir ce que vous faites, encore moins ce que vous devez faire en combien de millisecondes, personne ne peut vous répondre par oui ou par non.

La meilleure chose est de fouetter un prototype et voir ce que c'est comme IRL. Encore une fois, Knuth, etc.

3
  1. Les attributs sont chargés lorsque l'assemblage est chargé. Ils font partie des informations de type, donc sont chargés avec les types automatiquement.
  2. Il y a un (très petit) coût en termes de taille d'assemblage avec des attributs. Cependant, c'est très mineur, et pas quelque chose dont je serais concerné.
  3. Vous pouvez le faire, mais seulement de la manière que vous montrez.
  4. Il n'y a aucun impact sur les performances des attributs. Ils sont ignorés lors de l'exécution à moins que la réflexion ne soit utilisée pour interroger explicitement les attributs.