2012-02-06 15 views
12

Dado que los atributos son solo Metadatos unidos a ensamblados, ¿eso significa que los Objetos de atributo solo se crean cuando se solicitan (como cuando se llama a GetCustomAttributes)?¿Cuándo se crean los objetos de atributo?

¿O están creados en la creación del objeto?

O, una combinación de los primeros 2, creado cuando el objeto se crea debido a la exploración de atributos por el CLR?

+0

Bastante relacionado: [.NET Atributos: ¿Por qué GetCustomAttributes() crea una nueva instancia de atributo cada vez?] (Http://stackoverflow.com/q/417275/319403). Incluso podría responder su pregunta, teniendo en cuenta. – cHao

+0

Lo hizo de una manera. La verdadera pregunta no era realmente un problema para mí, pero en el medio llegó la respuesta. También es bueno tener las escrituras del libro de CLR (a través de @Smi). – Dann

Respuesta

8

De CLR a través de C#, tercera edición:

Si desea construir un objeto atributo, debe llamar a cualquiera GetCustomAttributes o GetCustomAttribute. Cada vez que se llama a uno de estos métodos, construye nuevas instancias del tipo de atributo especificado y establece cada uno de los campos y propiedades de la instancia en función de los valores especificados en el código fuente. Estos métodos devuelven referencias a instancias totalmente construidas de las clases de atributos aplicadas.

Así que sí, solo se crean bajo pedido.

4

Se crean bajo pedido.

Por ejemplo, si agrega algunos atributos .NET 3.0 a un ensamblado .NET 2.0 (por ejemplo, WCF DataContractAttribute), usted todavía será capaz de utilizar el ensamblado .NET 2.0 en una máquina que no tiene .NET 3.0 instalado, siempre que no tenga ningún código que intente acceder a los atributos.

2

No es tan limpio, los atributos también afectan la generación de código. Algunos atributos son interpretados por el compilador, [DllImport] por ejemplo. Algunos son descubiertos por el jitter, [MethodImpl] por ejemplo. Esto se extiende infinitamente a otras herramientas y clases en el marco que se escribieron para aprovechar los atributos.

Pero estas herramientas solo hacen lo que necesita hacer si quiere encontrar sus propios atributos, es necesario llamar a GetCustomAttributes(). Ese tipo de código nunca se asocia con una instancia del objeto, los atributos se aplican a los tipos.

+0

Entonces, ¿esos atributos que pertenecen al sistema ("DllImport") se mantendrán como metadatos y se analizarán de esa manera, en lugar de que un objeto se cree y luego se utilice? – Dann

+1

Lo que realmente hacen * las herramientas * con el atributo está por todos lados. –

Cuestiones relacionadas