2017-04-12 2 views
1

Ich habe unter Erwähnen Eigenschaft Klasse mit Namen als "Mitarbeiter".Wie wurde die Speicherzuweisung für das folgende Szenario vorgenommen? Ich habe es geschafft, es zu verwechseln

public class Employee 
{ 
    public int EmpID { get; set; } 
    public int DeptId { get; set; } 
} 

Wir alle wissen, dass „int“ Datentyp Speicher im Stapel und Objekttyp ist, wird Speicher im Heap sein wie wie unten einrasten.

enter image description here

Hier ist meine Frage, wenn ich ein Objekt von Mitarbeiter Klasse wie

Employee objEmployee = new Employee(); 

Wie Speicherzuordnung erfolgt ist schaffen werde?

Alle Literatur oder verwandten Link würde geschätzt werden.

+0

Ich weiß nicht, warum unten abstimmen? –

Antwort

13

Wir alle wissen, dass „int“ Datentyp Speicher wird in Stapel und Objekttyp wird Speichern Sie in Heap wie unten Snap.

Da dies völlig falsch, wissen wir nicht alle wissen, dass.

Denken Sie daran:

int[] M() { return new int[] { 1 }; } 

die 1 auf dem Stapel ist? Wenn ja, wie kann dann von M's Anrufer zugegriffen werden, nachdem M zurückkommt?

Offensichtlich kann es nicht sein. Die 1 ist auf dem Heap, obwohl es ein int ist.

Ihr Problem ist, dass Sie an Werte denken, nicht an Variablen. Eine Variable ist Speicher, unabhängig davon, ob eine ganze Zahl oder ein Verweis darin gespeichert ist. Dieser Speicher muss irgendwo sein. Wo diese Speicherung ist hängt von der Lebensdaueranforderung ab. Kurzzeitspeicher kann aus dem Kurzzeitspeicherpool - Stack oder Registern - zugewiesen werden. Langzeitspeicher wird aus dem Langzeitspeicherpool - dem Heap - zugewiesen. Es hat nichts überhaupt damit zu tun, ob der gespeicherte Wert eine Struktur oder eine Referenz ist.

In Ihrem Beispiel kann der Sicherungsspeicher für die Eigenschaften beliebig lange leben und muss daher vom Heapspeicher zugewiesen werden.

Sie müssen einfach aufhören zu glauben, der Mythos, dass Werte von Werttypen auf dem Stapel gehen. Die Werte gehen in Speicher und Speicher geht dahin, wo es gehen muss, um seine lebenslangen Anforderungen zu erfüllen.

-1

Employee in Ihrem Beispiel ist ein Referenztyp. Es platzierte sich in Heap und im Stapel hast du nur reference dazu. Egal, welche Felder innerhalb dieser Klasse sind

Ich schlage vor, Sie this article by Joseph Albahari den Unterschied zwischen Wert und Referenztypen zu sehen

Verwandte Themen