wie ich sie verstehe, int Werttyp und deshalb lebt in dem Stapel
Ihr Verständnis ist falsch. Werttypen werden als "Werttypen" bezeichnet, da sie nach Wert kopiert werden. Referenztypen heißen "Referenztypen", weil sie als Referenz kopiert werden. Es ist überhaupt nicht wahr, dass "Werttypen immer auf dem Stapel leben". Wenn das wahr wäre, würden sie "Stapeltypen" und "Heap-Typen" genannt werden.
Die Wahrheit ist, dass dies ein Implementierungsdetail ist. Verschiedene Framework-Implementierungen können den Stack und den Heap nach Belieben verwenden. Hier ist, wie die Microsoft-Implementierung macht es:
- der Wert einer Variablen vom Referenztyp ein Verweis auf Heap-Speicher ist. Eine Referenz ist im Grunde eine 32-Bit- oder 64-Bit-Ganzzahl.
- Der Wert einer Variablen vom Werttyp ist ihr Wert.
- Die Werte lokaler Variablen werden im Stapel gespeichert, es sei denn, die lokalen Variablen befinden sich in einem Iteratorblock oder sind geschlossene äußere Variablen einer anonymen Methode oder eines Lambda-Ausdrucks. In diesen Fällen werden die Werte der lokalen Variablen auf dem Heap gespeichert. Es sei denn natürlich die lokalen Variablen können weg optimiert werden, in diesem Fall gibt es überhaupt keinen Speicher. Oder vielleicht können sie registriert werden, in diesem Fall sind sie weder auf dem Stapel noch auf dem Haufen, sie sind in Prozessorregistern.
- Die Werte von Instanzvariablen von Referenztypen und statischen Variablen werden auf dem Heap gespeichert.
Ist das klar?
Es zeigt auf Werttyp, aber ist diese Referenz (auf Heap) nicht?
Das Feld "A" ist vom Werttyp. Es ist ein Feld und daher wird diese Variable auf dem Heap gespeichert.
Beim Erstellen der Instanz von Class1 werden die Feldtypen auch auf dem Heap erstellt?
Der Speicher für die Instanzvariablen befindet sich auf dem Heap, ja.
Aber dann verstehe ich nicht, wann es wirklich auf dem Stapel wäre, da fast immer Sie eine Instanz von Objekt erstellen müssen, um es Felder zu verwenden.
Es wäre nie auf dem Stapel. Wie ich oben sagte, sind die einzigen Dinge, die auf den Stack gehen, lokale Variablen (und vom Compiler erzeugte Provisorien), die keine geschlossenen Locals einer Lambda oder anonymen Methode sind und sich nicht in einem Iteratorblock befinden. Und natürlich ist der Jitter frei, sie vollständig vom Stapel zu halten und sie in Register zu setzen, wenn es freie Register gibt.
Aber wirklich, ich muss fragen, warum interessiert es dich, was auf dem Stapel geht und was auf dem Haufen geht? Was auf den Stapel kommt, sind Sachen, die wir billig auf den Stapel legen können; alles andere geht auf den Haufen.
Klassennamen mit einer Nummer zu starten – cpalmer
nicht Wegthema erlaubt: Sie dort – thelost
durch ungültige Klassennamen haben, wie gut :) – Mirek