property net help decoration custom attributetargets attribute attrib asp c# .net attributes performance

help - ¿Es caro el uso de atributos en.Net(C#)?



help attribute c# (2)

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

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, 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 de los gastos 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?


"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é involucrado, pero probablemente almacenara 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 construir una cadena en el diccionario enum (o viceversa).


Depende de cómo los use ... Algunos atributos son solo para fines informativos (por ejemplo, ObsoleteAttribute), por lo que no tienen ningún impacto en el rendimiento del tiempo de ejecución. El compilador utiliza otros atributos (como DllImportAttribute) o postcompiladores 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.