Warum speichert der Compiler konstante Werte in den Assembly-Metadaten? Sind sie aus den Assembly-Metadaten direkt in den Intermediate Language-Code eingebettet?
c#
clr
compilation
Arun
quelle
quelle
Antworten:
Der beste Weg, darüber nachzudenken, ist: Zur Kompilierungszeit wird eine Konstante in ein Literal konvertiert, in dem sie verwendet wird.
Der einzige Grund, warum es in das Manifest der Versammlung aufgenommen wird, in der es definiert wurde, bestand darin, es den Verbrauchern zugänglich zu machen. Es ist Teil eines bestimmten Typs und die Metadaten dieses Typs werden in seiner Assembly gespeichert, nicht in den Assemblys, die ihn verwenden.
Es handelt sich also um ein Inline-Literal für den Verbrauch und eine vom Typ eingekapselte Eigenschaft oder ein Feld für Verbrauchsmaterialien in Metadaten.
quelle
Ich habe mich ziemlich lange selbst recherchiert und aus einem Buch herausgefunden, dass dies der Grund sein kann ...
Da sich konstante Werte nie ändern, werden Konstanten als Teil des definierenden Typs betrachtet. Durch das Definieren von Konstanten werden daher Metadaten erstellt.
quelle
Ich denke, Sie verwechseln zwei Baugruppen.
Die Konstante wird nur in den Metadaten in der Assembly gespeichert, in der sie definiert ist . Metadaten enthalten Informationen zu allen Typen und Elementen in einer Assembly, und Konstanten sind Mitglieder.
In der Assembly, in der sie verwendet wird, werden keine Informationen über die Konstante gespeichert . Der konstante Wert wird direkt in der IL verwendet, als hätten Sie die konstante Zahl oder Zeichenfolge direkt in die Quelle geschrieben.
Ein Beispiel: Eine meiner Anwendungen verwendet viele Konstanten, um Datenbanktabellen und -felder zu identifizieren. Ich habe eine Assembly, die nur alle Konstanten enthält.
Wenn ich die Anwendung erstelle, füge ich einen Verweis auf die Assembly "Konstanten" in Visual Studio hinzu. Da die Assembly nur Konstanten enthält, gibt es in meiner Anwendung keinen Verweis darauf, und die Assembly "Konstanten" wird zur Laufzeit nicht benötigt.
quelle
Konstanten sind zur Kompilierungszeit bekannt und werden dann in den Metadaten der Assembly gespeichert. Dies bedeutet, dass Sie nur Konstanten für primitive Typen definieren können.
Ja, sie werden direkt aus Metadaten geladen. Zur Laufzeit würde keine Speicherzuweisung erfolgen.
quelle