2017-02-27 2 views
1

Ich wurde kürzlich in einem Interview gefragt, wo tatsächlich Variablen gespeichert sind. Ich beantwortete Werttyp Variablen sind auf Stack gespeichert und Referenztyp Variablen sind auf Heap gespeichert, aber der Interviewer fragte mich, mir Echtzeit-Szenario in einem Programm zu geben.Bitte überprüfen Sie das Programm unten und mir helfen, wo Werttypen gespeichert sind und wer gehen in Referenz speichern type.If Sie zB mit dem Programm geben kann es sehr hilfreich sein oder mich jedes Werkzeug wissen lassen, wo ich in VS überprüfen können, wo dieseWerttyp und Referenztyp Echtzeitspeicherzuweisung

gespeichert werden immer
class Program 
{ 
    int i = 5; 
    bool a; 
    string str = "Stack Overflow"; 
    object obj = "object"; 
    string employeeName; 
    int employeeCode; 

    public int Add(int x,int y) 
    { 
     float a = 7.0F; 
     return x + y; 
    } 


    static void Main(string[] args) 
    { 
     Program obj = new Program(); 
     obj.employeeCode = 1000; 
     obj.employeeName = "John"; 
     int result = obj.Add(10, 15); 
    } 
} 

Bitte lassen Sie mich wissen, wo diese Variable sind gespeichert irgendein warum. Geben Sie ein Beispiel für Werttyp und Referenztyp beide

+0

'Werttyp Variablen auf dem Stack gespeichert werden und die Referenz-Typ-Variablen werden auf Heap' gespeichert - Dies ist einer der größten Mythen in C# Sprache. Einen guten Einblick in dieses verwirrende Thema finden Sie im Artikel [this] (http://jonskeet.uk/csharp/memory.html). – RBT

+0

Ein sehr nah verwandter Beitrag [hier] (https://stackoverflow.com/q/3542083/465053). – RBT

Antwort

3

Das Folgende ist die Übersicht über das, was unter der Haube vorgeht. Die besten Beispiele, die ich anbieten könnte, sind eine Reihe von Figuren mit Stack- und Heap-Darstellung.

Als erstes stellen wir uns vor, dass wir 2 Klassen haben: Soldat und Offizier. Offizier erweitert Soldat. Außerdem haben wir eine gewisse Logik in Methode1. Wenn die Ausführung von method1 beginnt, haben wir einen Zustand von Stack und Heap. Stack hat etwas von der vorherigen Ausführung, was momentan nicht wichtig ist und Heap hat unsere Klassendefinitionen.

Initial state

1) Zu Beginn des method1, haben wir ein paar Erklärung Aussagen so werden zwei Variablen in Stapel s und Alter geschoben werden. Gerade jetzt s hat nichts zu deuten auf und Alter == 0.

enter image description here

2) s = new Officer() Anweisung erstellt neues Objekt in Heap und Adresse dieses Objekt ist jetzt zugewiesen s

enter image description here

3) vorstellen Lasst uns, dass S oldier.Lookup (Name) ist eine statische Methode in der Soldier-Klasse. Beispielsweise fragt es die Datenbank ab und generiert ein neues Officer-Objekt. Als Ergebnis zeigt der Zeiger s auf ein neues Objekt und das vorherige Objekt ist ein Kandidat für Garbage Collection.

Static method call

4) Die nächste Anweisung ist nur eine Wertzuweisung. Alter ist jetzt 31 (31 ist das Ergebnis der Operation GetSoldierAge()).

Simple assignment

5) s.CurrentStatusReport() hat einige Nebenwirkungen (Bericht drucken) und unser Gedächtnis nicht beeinflusst, so dass wir es einfach ignorieren. Die nächste Anweisung ist ein Anruf von sendOutForTraining (Alter, s) Methode und hier ist eine Menge Spaß :)

Wert/Referenz. Der interessante Teil.

6) Wenn die Ausführung kommt in sendOutForTraining (Alter, s) geschieht folgendes:

  • Zeiger auf sendOutForTraining wird auf dem Stapel (zum Rück Zwecke geschoben).

  • Variable Eine wird erstellt und auf den Stapel geschoben. Der Wert von Alter wird sofort in die a kopiert.

  • Variable sldr wird erstellt und auf den Stapel geschoben. Der Zeiger von s in sldr kopiert und jetzt s und sldr weisen auf das gleiche Objekt.

entering sendOutForTraining

sendOutForTraining Eingabe

7) Das Ergebnis einer + = 2 in dem Stapel, berechnet und gespeichert. Wie Sie sehen können, sind die Alter und ein verschiedene Variablen und enthält verschiedene Werte.

a assignment

8) In Ordnung, sldr.age = a. Es sollte klar sein, dass das Ergebnis dieser Operation das gemeinsame Objekt beeinflussen wird, das s und sldr zeigen. Also sollte das Alter 33 außerhalb dieser Methode gleich sein.

age changing

9) Eine weitere Aufgabe. sldr = neuer Soldat(); Das Ergebnis ist ein brandneues Objekt und seine Adresse ist jetzt in SLDR gespeichert. Die s Variable von außerhalb der Methode wissen nicht darüber und absolut nicht interessiert.

New object created

10) Die Endabrechnung einfach das Instanzfeld des Objekts unter der Adresse sldr ändern.

Change age of another object

11) Das Ausführungsverfahren endet, soll jeder Artefakt gereinigt werden, wenn die Arbeit erledigt ist. Unbenutzte Variablen werden zerstört und Objekte werden als Müll gesammelt.

Cleaning artifacts

12) Wie wir sehen können, sedOutForTraining hat die Marke gelebt. Die Instanzvariable Offizier Objekt hat es age = 33.

The final state


Verwandte Themen