¿Por qué el compilador almacena valores constantes en los metadatos del ensamblado? ¿Están directamente incrustados en el código de lenguaje intermedio de los metadatos del ensamblado?
c#
clr
compilation
Arun
fuente
fuente
Respuestas:
La mejor manera de pensarlo es: en tiempo de compilación, una constante se convierte en un literal donde se usa.
La única razón por la que entra en el manifiesto en el ensamblaje en el que se definió fue para que sea accesible para los consumidores. Es parte de un tipo dado y los metadatos de ese tipo se almacenan en su ensamblaje, no en los ensamblajes que lo consumen.
Por lo tanto, es un literal en línea en el consumo, y una propiedad o campo consumible encapsulado en metadatos.
fuente
Investigué durante mucho tiempo y descubrí en un libro que esta puede ser la razón ...
Como los valores constantes nunca cambian, las constantes se consideran parte del tipo de definición. Por lo tanto, la definición de constantes crea metadatos.
fuente
Creo que mezclas dos conjuntos.
La constante solo se almacena en los metadatos en el ensamblaje donde se define . Los metadatos contienen información sobre todos los tipos y miembros de un ensamblado y las constantes son miembros.
No se almacena información sobre la constante en el ensamblaje donde se usa . El valor constante se usa directamente en la IL como si hubiera escrito el número constante o la cadena directamente en la fuente.
Un ejemplo: una de mis aplicaciones usa muchas constantes para identificar tablas y campos de bases de datos. Tengo un ensamblaje que solo contiene todas las constantes.
Cuando construyo la aplicación, agrego una referencia al ensamblaje de "constantes" en Visual Studio. Como el ensamblado solo contiene constantes, no hay ninguna referencia en mi aplicación y el ensamblaje de "constantes" no es necesario en tiempo de ejecución.
fuente
Las constantes se conocen en tiempo de compilación y luego se almacenan en los metadatos del ensamblado. Esto significa que solo puede definir constantes para tipos primitivos.
Sí, se cargan directamente desde los metadatos. No habría asignación de memoria en tiempo de ejecución.
fuente