Perché il compilatore memorizza i valori costanti nei metadati dell'assieme? Sono direttamente incorporati nel codice della lingua intermedia dai metadati dell'assembly?
Il modo migliore per pensarci lo trovo: al momento della compilazione un const viene convertito in un valore letterale in cui viene utilizzato.
L'unico motivo per cui è stato inserito nel manifest nell'assembly in cui è stato definito è stato renderlo accessibile ai consumatori. È una parte di un determinato tipo e i metadati di quel tipo sono memorizzati nel suo assembly, non negli assembly che lo consumano.
Quindi, è un valore letterale in-linea nel consumo e una proprietà o campo incapsulato del tipo consumabile nei metadati.
Mi sono interrogato da molto tempo e ho trovato da un libro che questo può essere il motivo ...
Poiché i valori costanti non cambiano mai, le costanti sono considerate come parte del tipo di definizione. Pertanto, la definizione delle costanti crea metadati.
Penso che mischiate due assiemi.
La costante viene memorizzata solo nei metadati nell'assembly dove è definita . I metadati contengono informazioni su tutti i tipi e membri in un assieme e le costanti sono membri.
Nessuna informazione sulla costante è memorizzata nell'assembly in cui è utilizzata . Il valore costante viene utilizzato direttamente nell'IL, proprio come se avessi scritto il numero o la stringa costante direttamente nella sorgente.
Un esempio: una delle mie applicazioni utilizza molte costanti per identificare tabelle e campi del database. Ho un assembly che contiene solo tutte le costanti.
Quando costruisco l'applicazione aggiungo un riferimento all'assembly "costanti" in Visual Studio. Poiché l'assembly contiene solo costanti, non vi è alcun riferimento ad esso nella mia applicazione e l'assembly "costanti" non è necessario in fase di esecuzione.
Le costanti sono conosciute in fase di compilazione e quindi vengono memorizzate nei metadati dell'assembly. Ciò significa che è possibile definire le costanti solo per i tipi primitivi.
Sì, sono caricati direttamente dai metadati. Non ci sarebbe alcuna allocazione di memoria in fase di runtime.
Leggi altre domande sui tag c# compilation clr