Constantes en C #

9

¿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?

Arun
fuente
1
esto realmente no aborda el 'por qué' pero es interesante: stackoverflow.com/a/2128633/128384
stijn
Estoy confundido por esta pregunta. ¿Dónde más se almacenarían si no fuera en metadatos? ¿Puedes aclarar la pregunta?
Eric Lippert el

Respuestas:

4

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.

Jimmy Hoffa
fuente
2

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.

Arun
fuente
1

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.

adrianm
fuente
2
Sin embargo, esto realmente no explica por qué las constantes se almacenan en los metadatos. Baila en torno a por qué, pero no creo que el OP esté confundiendo a dos conjuntos en absoluto. Lo ves como un problema de dos conjuntos porque usas dos conjuntos, pero no creo que la práctica sea común; las constantes generalmente se definen en el mismo ensamblaje donde se usan.
Robert Harvey
@RobertHarvey Su presunción del caso típico sobreestima la habilidad de muchos de nuestros colegas empresariales de C #, muchas veces tuve que explicar lo que es una constante para los colegas y por qué no los llama a través de las asambleas.
Jimmy Hoffa
1

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.

Huelguista
fuente
1
Decimal no es un tipo primitivo pero puede hacer constantes decimales. Y puede hacer constantes de cualquier tipo de referencia, siempre que la constante sea nula.
Eric Lippert el