2016-05-27 31 views
5

Wenn Unboxing stattfindet, gibt es die Kopie von boxed Wert in einen geeigneten Variablentyp, aber was passiert am Speicherort der Box Kopie auf Heap. Bleibt die Box-Kopie an diesem Ort und deckt den Speicher auf dem Heap ab?Mechanismus des Unboxing

Antwort

4

Ist die Boxed-Kopie an dieser Position und deckt den Speicher auf Heap?

Ja. Schließlich könnte es auch andere Verweise darauf sein:

object o1 = 5; 
object o2 = o1; 
int x = (int) o1; 
x = 10; 
Console.WriteLine(o2); // Still 5 

Boxed Werte verhalten sich wie normale Objekte in Bezug auf die für die Garbage Collection förderfähig zu sein, wenn es ihnen nicht mehr starke Referenzen sind.

3

Ja, natürlich, beim Unboxing, ist das Original immer unberührt.

Unten auf der IL-Ebene gibt es zwei Opcodes für das Unboxing: unbox.any und unbox.

Nach MSDN, regarding unbox.any:

Wenn an die geschachtelte Form eines Typs Wert angewendet, der unbox.any Anweisung extrahiert die innerhalb enthaltenen Wert obj (vom Typ O) und ist deshalb entspricht der Entpackung gefolgt von ldobj.

und regarding unbox:

[...] unbox ist nicht erforderlich den Werttyp aus dem Objekt zu kopieren. In der Regel wird einfach die -Adresse des Werttyps berechnet, der bereits innerhalb des eingerahmten Objekts vorhanden ist.

So kann eine Kopie des ursprünglichen Werts erstellt werden oder nicht, aber der ursprüngliche Wert bleibt immer unberührt.