2009-11-09 13 views
10

1 ... ¿Hay algún gasto de rendimiento causado por el uso de atributos? Piense por una clase como:Recarga de rendimiento al usar atributos en .NET

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

donde tiene 10 attibutes (atributos que son clases, donde las clases de atributos mismos son mucho más grande que la propia MyClass como:

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

2 .. Would 10 de estos Los atributos son una sobrecarga de memoria cada vez que se crea una instancia de MyClass (FirstAttribute) que es 10 veces el tamaño de MyClass que se decorará con 10 de estos, haciendo que el objeto real sea tan pequeño en comparación con el tamaño total de los atributos que están decorados.) ¿Es esto una preocupación?

3 ... ¿Este escenario sería diferente para las estructuras (las estructuras son tipos de valores y los atributos son tipos de referencia)?

4 .. ¿Dónde se almacenan los atributos en la memoria en relación con el objeto al que están adjuntos? ¿Cómo están enganchados?

5 .. ¿Los atributos se inicializan tan pronto como se inicializa MyClass o cuando se usa la reflexión para recuperarlos?

Respuesta

25
  1. Hay un poco de sobrecarga en términos de espacio, pero no mucho: los atributos no se interponen en el camino de la ejecución normal.

  2. No, los atributos actúan en tipos, no en instancias, por lo que no ocupará una gran cantidad de memoria mediante el uso de muchos atributos "grandes". (No sé si usted consigue uno por concreto Tipo para los genéricos, o uno por definición de tipo genérico - yo esperaría que este último ...)

  3. No, porque de la respuesta a 1.

  4. Los atributos no están adjuntos a los objetos; están adjuntos a los tipos. No sé los detalles de exactamente donde están almacenados en la memoria, pero eso es un detalle de implementación de todos modos.

  5. Los atributos solo se inicializan cuando utiliza la reflexión.

+0

Gracias Jon, usted es tan rápido. Ahora lo entiendo. –

+0

Los atributos son solo objetos de tipos de referencia, por lo que se crean instancias y se almacenan en la memoria de la misma manera que cualquier otro objeto. –

+0

... a menos que esté usando algo como http://www.postsharp.org/ – TrueWill

4

Jon Skeet es derecho absoluto y sólo quiere dar una idea adicional:

Si usted tiene un vistazo a la clase base de todos los atributos, System.Attribute, se dará cuenta, que la mayoría de sus miembros son static. Entonces existen solo una vez, no importa cuántas instancias de atributo tenga.

Esto es sólo otro punto a destacar, que los atributos no son demasiado costosos ...

Cuestiones relacionadas