2009-11-09 6 views
10

1 .. Y a-t-il un surcoût lié à l'utilisation des attributs? Pensez à une classe comme:Gestion des performances liées à l'utilisation des attributs dans .NET

public class MyClass 
    { 
     int Count {get;set;} 
    } 

où il a 10 attibutes (attributs étant des classes, où les classes d'attributs eux-mêmes sont beaucoup plus grandes que MyClass lui-même comme:

public class FirstAttribute : Attribute 
{ 
    int A,B,C,D,E,F,G,H,I,J ... {get;set;} 
} 

2 .. Would 10 de ces attributs est un surcoût de mémoire à chaque fois MyClass est instancié? (FirstAttribute étant 10 fois la taille de MyClass qui sera décoré avec 10 d'entre eux, rendant ainsi l'objet lui-même si petit par rapport à la taille totale des attributs qui y sont décorés. Est-ce une préoccupation?

3 .. Ce scénario serait-il différent pour les structures (les structures étant des types de valeur et les attributs étant des types de référence)?

4 .. Où les attibuts sont-ils stockés en mémoire par rapport à l'objet auquel ils sont attachés? Comment sont-ils accrochés ensemble?

5 .. Les attributs sont-ils initialisés dès que MyClass est initialisé ou lorsque vous utilisez la réflexion pour les récupérer?

Répondre

25
  1. Il y a un petit peu de surcharge en termes d'espace, mais pas beaucoup - les attributs ne gênent pas l'exécution normale. Non, les attributs agissent sur les types, et non sur les instances, donc vous ne consommerez pas beaucoup de mémoire en utilisant beaucoup d'attributs "gros". (Je ne sais pas si vous obtenez un par béton de type pour les médicaments génériques, ou par une définition de type générique - j'attends ce dernier ...)

  2. Non, à cause de la réponse à 1.

  3. Les attributs ne sont pas attachés aux objets - ils sont attachés aux types. Je ne connais pas les détails de exactement où ils sont stockés dans la mémoire, mais c'est un détail d'implémentation de toute façon.

  4. Les attributs ne sont initialisés que lorsque vous utilisez la réflexion.

+0

Merci Jon, vous êtes si vite. Je comprends maintenant. –

+0

Les attributs ne sont que des objets de types références, ils sont donc instanciés et stockés en mémoire de la même manière que n'importe quel autre objet. –

+0

... sauf si vous utilisez quelque chose comme http://www.postsharp.org/ – TrueWill

4

Jon Skeet est droit absolu et je veux seulement donner une idée supplémentaire:

Si vous avez un oeil à la classe de base de tous les attributs, System.Attribute, vous remarquerez que la plupart de ses membres sont statique. Ils n'existent donc qu'une seule fois, quel que soit le nombre d'instances d'attributs que vous avez.

Ceci est juste un autre point à souligner, que les attributs ne sont pas trop coûteux ...