Pourquoi le compilateur stocke-t-il des valeurs constantes dans les métadonnées d'assembly? Sont-ils directement intégrés au code du langage intermédiaire à partir des métadonnées d'assembly?
Pourquoi le compilateur stocke-t-il des valeurs constantes dans les métadonnées d'assembly? Sont-ils directement intégrés au code du langage intermédiaire à partir des métadonnées d'assembly?
Réponses:
La meilleure façon d'y penser est la suivante: au moment de la compilation, un const est converti en un littéral où il est utilisé.
La seule raison pour laquelle il entre dans le manifeste de l'assemblage dans lequel il a été défini était de le rendre accessible aux consommateurs. Il fait partie d'un type donné et les métadonnées de ce type sont stockées dans son assembly, et non dans les assemblys qui le consomment.
Il s'agit donc d'un littéral en ligne de consommation et d'une propriété ou d'un champ encapsulé de type consommable dans les métadonnées.
Je me suis longuement renseigné et j'ai découvert dans un livre que cela pouvait être la raison ...
Étant donné que les valeurs constantes ne changent jamais, les constantes sont considérées comme faisant partie du type de définition. Par conséquent, la définition de constantes crée des métadonnées.
Je pense que vous mélangez deux assemblées.
La constante n'est stockée que dans les métadonnées de l' assembly où elle est définie . Les métadonnées contiennent des informations sur tous les types et membres d'un assemblage et les constantes sont des membres.
Aucune information sur la constante n'est stockée dans l' assembly où elle est utilisée . La valeur constante est utilisée directement dans l'IL comme si vous aviez écrit le nombre constant ou la chaîne directement dans la source.
Un exemple: une de mes applications utilise de nombreuses constantes pour identifier les tables et les champs de la base de données. J'ai un assemblage qui ne contient que toutes les constantes.
Lorsque je crée l'application, j'ajoute une référence à l'assembly "constantes" dans Visual Studio. Étant donné que l'assembly contient uniquement des constantes, il n'y a aucune référence à celui-ci dans mon application et l'assembly "constantes" n'est pas nécessaire au moment de l'exécution.
Les constantes sont connues au moment de la compilation, puis elles sont stockées dans les métadonnées de l'assembly. Cela signifie que vous ne pouvez définir des constantes que pour les types primitifs.
Oui, ils sont directement chargés à partir des métadonnées. Il n'y aurait pas d'allocation de mémoire au moment de l'exécution.