2011-02-17 12 views
5

Sto giocando con la riflessione e per sbaglio mi sono reso conto che avrei potuto posizionare un attributo di campo personalizzato su una variabile di classe const, quindi (usando la reflection) ho letto i campi della classe, ho trovato il const con l'attributo ed eseguito le azioni. Funziona benePerché puoi leggere un attributo posto su un const usando il reflection in C#?

Sono curioso di sapere perché funziona bene. A meno che non abbia capito bene come funzionano i sali, ho pensato che le costanti fossero "compilate" e che tutti i riferimenti a quella costante diventassero il valore reale della costante dopo la compilazione. Se questo è il caso, perché la riflessione può ancora vedere i valori const?

+2

OK, supponiamo che il mondo abbia funzionato come immaginavi. ** Come saresti in grado di utilizzare un valore costante definito in un assieme, se non ci fossero metadati per la costante incorporata nell'assieme? ** Questa non è una domanda retorica; Sono sinceramente interessato al motivo per cui le persone credono cose strane sui linguaggi di programmazione, in modo da poter rendere migliori lingue e documentazione in futuro. –

+0

@Eric Lippert: presumo che sia perché altri linguaggi di programmazione funzionano in questo modo, specialmente quelli che le persone incontrano prima. Non ho mai assunto costanti compilate in .NET, ma non mi sorprende che qualcuno le menzioni, perché è coerente con la mia conoscenza di ad es. Delphi o C. Inoltre, come hanno detto le persone, alcune cose sulle costanti sono compilate e ci vuole l'ulteriore comprensione che hai fatto prima che diventi chiaro che la costante stessa non viene rimossa dall'assemblea. – Stobor

risposta

11

Tutti i riferimenti a const vengono compilati, non la dichiarazione const stessa. Qualsiasi dichiarazione const viene emessa come parte dell'IL dal compilatore.

Ecco un esempio (si noti che l'IL conserva il campo const).

C#:

class Foo 
{ 
    const int i = 0; 
} 

IL:

.class private auto ansi beforefieldinit Foo 
    extends [mscorlib]System.Object 
{ 
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
    { 
    } 


    .field private static literal int32 i = int32(0)  
} 
1

ho pensato costanti sono stati "compilato out" e tutti i riferimenti a quella costante è diventato il valore effettivo del costante dopo la compilazione. Se questo è il caso

direi che questo è non il caso. Un const è ancora un membro a pieno titolo della sua classe. Si consideri una libreria che espone uno public const. Potrebbe non esserci nemmeno eventuali riferimenti (all'interno della libreria stessa) da "compilare".

Problemi correlati