Speicher Zuweisung von Klassenobjekten
Ich wurde gebeten, diese Frage im interview. Bitte helfen Sie mir, finden Sie seine Antwort.
Angenommen, Sie haben eine Klasse Mitarbeiter. Es sind 2 Variablen, die in es - 1. String Name 2. Int Alter
Nun Employee emp = new Employee();
Nun die Fragen, die gestellt werden, sind :
- Wo das Objekt emp im Speicher gespeichert ich.e im stack oder heap-und wie ?
- Wo der name und das Alter Variablen werden im Speicher abgelegt und wie?
- Was bedeutet jedes Wort in dieser Aussage kann ich.e was macht Mitarbeiter tun..dann emp.. = .. dann.. dann Mitarbeiter dann.. () ..dann ;
- Was ist der Unterschied zwischen der obigen Aussage und Mitarbeiter emp; ? Sagen Sie in Bezug auf die Zuweisung von Speicher.?
Antworten Sie bitte mit Ihrer wertvollen Kommentare.
Ich gebe Tipps und Hinweise, aber ich werde nicht schreiben Sie eine Zeile code für Ihre Hausaufgaben.
Check this out : red-gate.com/community/books/... Es gibt eine freie PDF-version, die Sie herunterladen können.
Auch eine weitere sehr gute Quelle ist
Check this out : red-gate.com/community/books/... Es gibt eine freie PDF-version, die Sie herunterladen können.
Auch eine weitere sehr gute Quelle ist
CLR via C#, 4th Edition
shop.oreilly.com/product/0790145353665.do Sowie einen Kauf Wert.InformationsquelleAutor nitika tangri | 2013-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Frage ist schlecht formuliert.
emp
ist nicht ein Objekt;emp
ist ein variable die enthält einen Verweis auf ein Objekt.Also mal umformulieren der Frage:
Dem Objekt bezeichnet, die durch variable
emp
ist gespeichert im langfristigen Speicher, auch bekannt als "der Haufen".Die Frage nicht genügend Informationen zu sagen. Variable
emp
könnte ein statisches Feld, Instanz-Feld, oder eine lokale variable. (Es kann nicht sein, einen formalen parameter, da das Semikolon.) Wenn ein lokal, es könnte auch ein geschlossen-über äußere Variablen eines lambda-oder eine lokale von einer iterator-block, oder eine async-Methode. Alle diese ändern würde, ob der Variablen-Speicher ist in kurz-oder langfristigen Lagerung. Wenn es in die Kurzfristige Lagerung könnte es werden auf den stack oder ein register.Da Sie Felder einer Klasse, die Lagerorte Zusammenhang mit diesen Variablen werden immer auf die langfristige heap.
Seit
name
ist der Typstring
, die Sache, die es bezeichnet-eine Zeichenfolge -- ist auch auf dem heap. (Oder der Variablen kann null sein, in welchem Fall es bezieht sich nicht auf etwas.)Die Frage ist sehr schlecht formuliert. First off, sind diejenigen, die nicht "Worte", das sind "Token". (Und
()
ist zwei Token.) Zweitens, es ist völlig unklar, was die Frage bedeutet, durch "tun". Also lassen Sie uns die Frage anders stellen:Können wir nicht sagen, mit Präzision, weil es nicht genügend Informationen in der Frage. Die Frage sagt, es ist ein statement, es ist also nicht ein Feld-Deklaration. Nehmen wir an, der Einfachheit halber, dass es nicht in einen iterator block-oder async-Methode, und dass der lokale ist nicht eine äußere variable der anonymen Funktion.
Erste, Kurzfristige Lagerung ist reserviert für die variable; es ist wahrscheinlich registrierte; wenn nicht, wird es auf den stack. Es erhält einen null-Verweis.
Zweite, die Speicher-Zuweisung wird gebeten, zu produzieren, die leeren Speicher für eine Instanz von Employee, die auf dem heap. Es tut so, und erzeugt eine Referenz auf diesen Speicher.
Dritten, wenn dies das erste mal, dass wir gesehen haben Mitarbeiter und Mitarbeiter hat einen statischen Konstruktor, der statische Konstruktor ausgeführt wird.
Vierte, nach den statischen ctor abgeschlossen, die Mitarbeiter der Feld-Initialisierungen ausführen.
Fünften, Mitarbeiter Basisklasse Konstruktor ausgeführt wird. Dies könnte dazu führen, dass andere statische Konstruktoren auszuführen.
Sechsten, Mitarbeiter-Konstruktor Körper läuft.
Siebten, der Konstruktor abgeschlossen ist und der Verweis auf die inzwischen initialisierte Objekt wird kopiert in seinem Speicher.
All dies natürlich vorausgesetzt, dass nichts auf dem Weg ist, wirf eine Ausnahme.
Die Frage nicht genügend Informationen zu geben, eine genaue Antwort. Wenn die lokale variable wird nie benutzt und der compiler ist frei, optimieren Sie es Weg. Wenn es nicht optimieren Sie Weg, dann wird der Speicher für
emp
zugeordnet wird, die aus der kurzfristigen pool, auf null initialisiert, und nie benutzt.hilfreich..Danke!
InformationsquelleAutor Eric Lippert
Sollten Sie sehen: Der Stack Ist Eine Implementierung Detail, Teil Eins und Teil Zwei Von Eric Lippert
Auf heap, da es eine Referenz geben, da
Employee
ist eine Klasse.Sind Sie auch gespeichert auf heap. Obwohl das Alter ist ein Wert-Typ, aber Werttypen gespeichert werden, wo sich Ihr container Referenz gespeichert ist.
Erstellen Sie eine neue Instanz von
Employee
Klasseemp
Employee emp;
also nur der Erklärung, nicht Instanziierung. Das bedeutet, dass kein Speicher zugeordnet ist, um das Objekt und haltennull
.für diese, die ich nicht kannte. Wenn Sie möchten, können Sie Bearbeiten die Antwort mit den Details
hier die null-Referenz sein würde, stieß auf den stack oder auf dem heap? Denn wie die obige Antwort sagt, dass die Objekt gespeichert werden auf heap.
seine über Objekt-Referenz , nicht das Objekt, betrachten, anstatt es als etwas, das enthält die Adresse des heap für das Objekt. Gehen Sie durch die Artikel habe ich geschrieben in der Antwort. Sie erhalten ein besseres Verständnis für das besagte Thema
InformationsquelleAutor Habib
Es ist reserviert auf heap, als Sie sagte, dass
Employee
ist einclass
. Die Klassen sind aufgeteilt auf heap.Diese hängt davon ab, wie man Sie verwendet und kann variieren zwischen den unterschiedlichen Implementierung des frameworks. Im Allgemeinen, denken Sie, als ob Sie landet mit dem Objekt der Erinnerung selbst.
Ihnen zugewiesenen nececssary Speicher für den Typ
Employee
an und weisen Sie den Zeigeremp
. Die Zeigeremp
geschoben wird, ist auf stack oder heap, auf der Grundlage, wie es verwendet wird.ist das gleiche wie das schreiben
Employee emp = default(Employee);
- und Referenz-Typen Standard ist einnull
, so ist dies gleich zu schreibenEmployee emp = null;
. Also in Bezug auf die Zuordnung sollte nicht um einen Unterschied.Zur weiteren Lektüre:
C# Heap(ing) Vs Stack(ing).NET: Teil I
InformationsquelleAutor Tigran