2009-08-13 11 views
10

Me gustaría saber si el uso de Atributos en .Net, específicamente C#, es costoso, ¿por qué o por qué no?¿Es caro el uso de atributos en .Net (C#)?

Estoy preguntando acerca de C# específicamente, a menos que no haya diferencia entre los diferentes lenguajes .Net (porque las bibliotecas de la clase base son las mismas?).

Todas las tecnologías .Net más nuevas hacen un uso extensivo de atributos, tales como Linq a SQL, ASP.Net MVC, WCF, Enterprise Library, etc., y me preguntaba qué efecto tendría esto en el rendimiento. Muchas de las clases se decoran automáticamente con ciertos Atributos, o estos atributos son necesarios para ciertas funcionalidades/funciones.

¿La cuestión del gasto depende de los detalles específicos de la implementación? ¿Cómo se compilan los atributos en IL? ¿Se almacenan en caché automáticamente, o depende del implementador?

+3

No hay diferencia entre cualquier lenguaje .NET que se ejecute desde el CLR. No estoy seguro de cómo encaja el DLR en la imagen, pero una vez compilado, C# y VB.NET (y cualquier otro lenguaje CLR) son los mismos. –

Respuesta

19

"El uso de atributos" es demasiado vago. La obtención de los atributos es una operación de reflexión efectiva -no le gustaría hacerlo regularmente en un ciclo-, pero no es costoso incluirlos en los metadatos, y el patrón de uso típico (IMO) es construir alguna otra representación (p. Ej. un esquema en memoria) después de leer los atributos una vez.

Puede haber algo de almacenamiento en caché, pero probablemente guardará en caché la otra representación de todos modos. Por ejemplo, si estuviera decorando valores enum con descripciones, generalmente buscaría los atributos una vez para compilar una cadena de diccionarios enum (o viceversa).

+0

¿Cree que se puede suponer con seguridad que los atributos (o alguna representación de ellos) que forman parte de .Net BCL y otros Microsoft Frameworks/addons, están en caché? –

+1

Una vez más, eso es un poco vago. Si puede dar un ejemplo muy específico y cómo se puede determinar si se almacenan en caché o no, esa sería una pregunta más razonable para responder. –

6

Depende de cómo los use ... Algunos atributos son solo para fines informativos (ObsoleteAttribute por ejemplo), por lo que no tienen ningún impacto en el rendimiento del tiempo de ejecución. Otros atributos son utilizados por el compilador (como DllImportAttribute) o por compiladores posteriores como PostSharp, por lo que el costo es en tiempo de compilación, no de tiempo de ejecución. Sin embargo, si usa el reflejo para inspeccionar atributos en tiempo de ejecución, puede ser costoso.

Cuestiones relacionadas