Konstanten in C #

9

Warum speichert der Compiler konstante Werte in den Assembly-Metadaten? Sind sie aus den Assembly-Metadaten direkt in den Intermediate Language-Code eingebettet?

Arun
quelle
1
Dies spricht nicht wirklich das "Warum" an, ist aber dennoch interessant: stackoverflow.com/a/2128633/128384
stijn
Diese Frage verwirrt mich. Wo sonst würden sie gespeichert, wenn nicht in Metadaten? Können Sie die Frage klären?
Eric Lippert

Antworten:

4

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.

Jimmy Hoffa
quelle
2

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.

Arun
quelle
1

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.

adrianm
quelle
2
Dies erklärt jedoch nicht wirklich, warum Konstanten in den Metadaten gespeichert sind. Es tanzt um das Warum, aber ich glaube nicht, dass das OP zwei Versammlungen überhaupt verwirrt. Sie sehen es als Problem mit zwei Baugruppen, weil Sie zwei Baugruppen verwenden, aber ich denke nicht, dass diese Praxis üblich ist. Konstanten werden normalerweise in derselben Assembly definiert, in der sie verwendet werden.
Robert Harvey
@RobertHarvey Ihre Vermutung des typischen Falls überschätzt die Fähigkeiten vieler unserer C # -Kollegen in Unternehmen. Ich musste Kollegen oft erklären, was eine Konstante ist und warum Sie sie nicht über Baugruppen hinweg aufrufen.
Jimmy Hoffa
1

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.

Stürmer
quelle
1
Dezimal ist kein primitiver Typ, aber Sie können Dezimalkonstanten erstellen. Und Sie können Konstanten eines beliebigen Referenztyps erstellen, vorausgesetzt, die Konstante ist null.
Eric Lippert