2010-03-24 7 views
8

Ho letto tutorial dal Web su C# Attributi e metadati. È molto bello, ma mi sto chiedendo le sue implicazioni.C# Attributi e implicazioni dei metadati

  1. Gli attributi (personalizzati) caricati quando viene caricato l'assieme? o è solo quando usi la riflessione per recuperare i metadati?

  2. Sembra che gli attributi si aggiungano al totale delle dimensioni del codice perché vengono compilati nell'eseguibile? È giusto?

  3. È possibile avere attributi di tempo di compilazione? Cioè gli attributi saranno applicati solo se DEBUG è definito?

So che uno è quello di fare in questo modo:

#if DEBUG 
[MyCustomAttribute] 
#endif 

Ma mi chiedo se ci sia modo migliore?

  1. Esiste qualche avvertenza sulle prestazioni/memoria quando si utilizzano molti attributi? La mia piattaforma di destinazione sarà Xbox 360 (utilizzando C#/XNA).

Grazie!

-Stephanus

risposta

6

Ci sono due parti per gli attributi, il loro codice e il loro argomento di costruzione e dati di proprietà. Il codice è memorizzato nell'IL dell'assieme, i dati sono memorizzati nei metadati dell'assieme. Se non si utilizza un attributo, questo occupa solo spazio di memoria virtuale ma non richiede alcuna risorsa macchina.

Non succede nulla finché non si utilizza il metodo GetCustomAttributes(). Quindi il codice per la classe di attributi viene compilato just-in-time, proprio come il codice normale nell'assembly. E vengono chiamati il ​​costruttore e i setter delle proprietà, utilizzando i dati degli attributi nei metadati.Userai un po 'di RAM per entrambi quando il gestore di memoria mappa l'IL, il codice macchina e le pagine dei metadati.

4

1) attributi AFAIK sono pigri-istanziata, ma offrono l'assieme nella memoria.
2) Non da nessuna parte abbastanza vicino da preoccuparsi. Knuth, ecc.
3) Sì.

Utilizzare gli attributi significa utilizzare la riflessione, che si colloca tra alcune delle cose più lente che è possibile fare nel framework. Ma poi, è troppo lento per la tua applicazione? Senza sapere cosa stai facendo, per non parlare di cosa devi fare entro quanti millisecondi, nessuno può darti una risposta sì o no a questo.

La cosa migliore è montare un prototipo e vedere che cosa è come IRL. Ancora, Knuth, ecc.

3
  1. Gli attributi vengono caricati quando l'assembly viene caricato. Fanno parte delle informazioni sul tipo, quindi vengono caricati automaticamente con i tipi.
  2. C'è un costo (molto piccolo) in termini di dimensioni dell'assieme con attributi. Tuttavia, questo è molto minore, e non qualcosa di cui sarei preoccupato.
  3. Puoi farlo, ma solo nel modo che mostri.
  4. Nessun impatto sulle prestazioni di avere attributi. Vengono ignorati in fase di runtime a meno che non si utilizzi la reflection per interrogare esplicitamente gli attributi.
Problemi correlati