Perché il compilatore memorizza valori costanti nei metadati dell'assembly? Sono direttamente incorporati nel codice di lingua intermedia dai metadati dell'assembly?
Perché il compilatore memorizza valori costanti nei metadati dell'assembly? Sono direttamente incorporati nel codice di lingua intermedia dai metadati dell'assembly?
Risposte:
Il modo migliore per pensarci è che al momento della compilazione una const viene convertita in letterale dove viene usata.
L'unica ragione per cui si manifesta nell'assemblea in cui è stata definita è stata renderla accessibile ai consumatori. Fa 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 in termini di consumo e una proprietà o un campo incapsulati per tipo di consumabile nei metadati.
Penso che tu abbia confuso due assemblee.
La costante viene memorizzata solo nei metadati nell'assembly in cui è definita . I metadati contengono informazioni su tutti i tipi e membri in un assieme e le costanti sono membri.
Nessuna informazione sulla costante viene memorizzata nell'assieme in cui viene utilizzata . Il valore della costante viene utilizzato direttamente in IL, proprio come se si fosse scritto il numero costante o la stringa direttamente nella sorgente.
Un esempio: una delle mie applicazioni usa molte costanti per identificare campi e tabelle di database. Ho un assembly che contiene solo tutte le costanti.
Quando creo l'applicazione, aggiungo un riferimento all'assembly "costanti" in Visual Studio. Poiché l'assembly contiene solo costanti, nella mia applicazione non vi è alcun riferimento e l'assemblaggio "costanti" non è necessario in fase di esecuzione.
Le costanti sono note al momento della compilazione e quindi vengono archiviate nei metadati dell'assembly. Ciò significa che è possibile definire solo costanti per tipi primitivi.
Sì, vengono caricati direttamente dai metadati. Non ci sarebbe allocazione di memoria in fase di esecuzione.