Costanti in C #


9

Perché il compilatore memorizza valori costanti nei metadati dell'assembly? Sono direttamente incorporati nel codice di lingua intermedia dai metadati dell'assembly?


1
questo in realtà non affronta il 'perché', ma è comunque interessante: stackoverflow.com/a/2128633/128384
Stijn

Sono confuso da questa domanda. Dove altro verrebbero archiviati se non nei metadati? Puoi chiarire la domanda?
Eric Lippert,

Risposte:


4

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.


2

Ho studiato me stesso per molto tempo e ho scoperto da un libro che questo può essere il motivo ...

Poiché i valori delle costanti non cambiano mai, le costanti sono considerate parte del tipo di definizione. Pertanto la definizione delle costanti crea metadati.


1

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.


2
Questo non spiega davvero perché le costanti siano memorizzate nei metadati, però. Balla sul perché, ma non credo che l'OP stia confondendo due assemblee. Lo vedi come un problema di due assiemi perché usi due assiemi, ma non penso che la pratica sia comune; le costanti sono in genere definite nello stesso assieme in cui vengono utilizzate.
Robert Harvey,

@RobertHarvey La tua presunzione del caso tipico sopravvaluta l'abilità di molti dei nostri colleghi C # aziendali, molte volte ho dovuto spiegare cos'è una const per i colleghi e perché non li chiami attraverso assemblee.
Jimmy Hoffa,

1

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.


1
Il decimale non è un tipo primitivo ma è possibile creare costanti decimali. E puoi creare costanti di qualsiasi tipo di riferimento a condizione che la costante sia nulla.
Eric Lippert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.