Frage

Eine weitere aktuelle C # Interview Frage, die ich hat, war, wenn ich weiß, was Boxen und Unboxing ist. Ich erklärte, dass Werttypen sind auf dem Stack und Referenztypen auf Heap. Wenn ein Wert auf einen Referenztyp umgewandelt wird, nennen wir es Boxen und umgekehrt.

Dann fragte er mich, dies zu berechnen:

int i = 20;
object j = i;
j = 50;

Was ist i?

Ich verwirrte es auf und sagte: 50, wo sein tatsächlich 20. Nun denke ich, es zu verstehen, warum, aber wenn ich mit verschiedenen Kombinationen spielt ich war überrascht, das zu sehen:

Object a = 1; // Boxing
Object b = a; // referencing the pointer on stack to both objects on heap
a = 2; // Boxing

Ich erwarte b == 2 auch zu sehen, aber es ist nicht, warum? Ist es, weil die zweite Box zerstört und ersetzt das gesamte a Objekt auf dem Heap?

Weil, wenn ich das tue, es ist in Ordnung:

public class TT
{
    public int x;
}

TT t = new TT();
t.x = 1;
TT t2 = new TT();
t2.x = 2;
t = t2;
t.x = 3;

Was ist t2.x? Es sollte 3 sein, und es ist. Aber dies ist kein Beispiel für Boxen / Unboxing überhaupt, ist das richtig? Wie würden Sie dieses zusammenfassen?

Können die Werte immer die gleichen, wie oben in einer Box / Unboxing-Umwandlung werden?

War es hilfreich?

Lösung

  1. Sie haben Recht die zweite Zuordnung der erste ersetzt. Es wird nicht die boxed Wert ändern.

  2. Ihr Beispiel macht keinen Gebrauch von Boxen machen. Der Wert (int) als int gespeichert und nicht verpackt.

  3. Nein, Boxen hält nach wie vor die Unveränderlichkeit Garantie.

Andere Tipps

Sehr kurz: Boxen Mittel eine neue Instanz eines Referenztyps zu schaffen . Wenn Sie das wissen, Sie verstehen, dass eine Instanz nicht ändert eine andere zu schaffen.

Was Sie tun, mit a = 2 wird der Wert in der ‚Box‘ nicht ändern, erstellen Sie eine neue Instanz eines Referenztyps. Warum also sollte etwas anderes ändern?

  

Ich erwarte b == 2 auch zu sehen,   aber es ist nicht, warum? ist es, weil die   zweite Boxen zerstört und ersetzt   die ganze (a) -Objekt auf Halde?

Nein, nicht genau. Er verläßt das Objekt, wie es auf dem Heap ist (wie der b Variable auch verweist ihn) und erzeugt ein neues Objekt für den neuen Wert, der die a Variable verweisen wird.

Sie haben Recht, dass Ihr zweites Beispiel nicht Box nicht verwendet. Sie können keinen Wert zugreifen, der als Unboxing es auf andere Weise verpackt ist, so gibt es keine Möglichkeit, einen boxed Wert zu ändern.

Nicht einmal eine veränderbare Struktur wie Point kann geändert werden, wenn Sie geboxt. Für den Zugriff auf die Eigenschaften der Struktur haben Sie es unbox, so kann man nicht die boxed Struktur anstelle ändern.

Hier ist eine weitere interessante Variante, die Stefan Kommentare unterstützt:

        int i = 2;
        object a = i; // Boxing
        object b = a; // Referencing same address on heap as 'a', b == a

        b = i; // New boxing on heap with reference new address, b != a

b ist noch 1, weil b ist eine Referenz, die auf dem Heap auf das Objekt verweist immer noch mit einem Wert von 1 a 2 ist, weil Sie es auf ein neues Objekt auf dem Heap mit einem Wert von 2 zugewiesen.

t2.x ist 3, weil t und t2 sind zwei verschiedene Referenzen auf das gleiche Objekt auf dem Heap.

Ich denke, die Antwort auf Ihre Frage mit Unboxing ist, dass: Das Ergebnis einer Unboxing Umwandlung ist eine temporäre Variable (weitere Details: link ).

Ich glaube, Sie versuchen, etwas zu tun wie:

object a = new Point(10,10);
object b = new Point(20,20);
a = b;

((Point) b).X = 30; //after this operation also a.X should be 30

Der obige Code kompiliert nicht - Details in dem obigen Link, und ich denke, das ist die Antwort auf Ihre Frage lautet:

  

Ich erwarte b == 2 auch zu sehen,   aber es ist nicht, warum? ist es, weil die   zweite Boxen zerstört und ersetzt   die ganze (a) -Objekt auf Halde?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top