2009-08-13 8 views
10

Vorrei sapere se l'utilizzo di Attributi in .Net, in particolare C#, è costoso, e perché o perché no?Questo uso di attributi in .Net (C#) è costoso?

Sto chiedendo informazioni su C# in modo specifico, a meno che non ci siano differenze tra i diversi linguaggi .Net (perché le librerie delle classi di base sono le stesse?).

Tutte le nuove tecnologie .Net fanno ampio uso di attributi, come Linq a SQL, ASP.Net MVC, WCF, Enterprise Library, ecc., E mi chiedevo quale sarebbe stato l'effetto sulle prestazioni. Un sacco delle classi viene automaticamente decorato con determinati attributi, oppure questi attributi sono richiesti per determinate funzionalità/funzionalità.

La domanda di spesa dipende da dettagli specifici dell'implementazione? Come vengono compilati gli attributi in IL? Vengono memorizzati automaticamente nella cache o fino all'implementatore?

+3

Non c'è alcuna differenza tra qualsiasi linguaggio .NET che funziona su CLR. Non sei sicuro di come il DLR si adatta all'immagine, ma una volta compilato, C# e VB.NET (e qualsiasi altro linguaggio CLR) sono gli stessi. –

risposta

19

"L'utilizzo di attributi" è troppo vago. Recuperare gli attributi è un'operazione di riflessione efficace - non si vorrebbe farlo regolarmente in un ciclo - ma non sono costosi da includere nei metadati, e il modello di utilizzo tipico (IMO) è quello di costruire qualche altra rappresentazione (es. uno schema in memoria) dopo aver letto gli attributi una volta.

Potrebbe esserci un po 'di cache, ma probabilmente avrei comunque nascosto l'altra rappresentazione. Ad esempio, se dovessi decorare i valori enum con le descrizioni, in genere recupererei gli attributi una volta per creare una stringa nel dizionario enum (o viceversa).

+0

Pensi che si possa tranquillamente supporre che gli attributi (o una loro rappresentazione) che fanno parte di .Net BCL e altri Microsoft Frameworks/addon siano memorizzati nella cache? –

+1

Ancora, questo è un po 'vago. Se è possibile fornire un esempio molto specifico e in che modo si potrebbe determinare se siano memorizzati o meno nella cache, sarebbe una domanda più ragionevole a cui rispondere. –

6

Dipende da come vengono utilizzati ... Alcuni attributi sono solo a scopo informativo (ObsoleteAttribute per esempio), quindi non hanno alcun impatto sulle prestazioni di runtime. Altri attributi sono usati dal compilatore (come DllImportAttribute) o da post-compilatori come PostSharp, quindi il costo è in fase di compilazione, non in fase di esecuzione. Tuttavia, se si utilizza la reflection per ispezionare gli attributi in fase di esecuzione, può essere costoso.