2010-09-18 7 views
10

Ich habe Microsofts Class Room Training Mater gelesen. Ich lese die folgendenUnboxing erstellt keine Kopie des Werts. Ist das richtig?

Unboxing Unboxing ist das Gegenteil von Boxen. Dies ist die explizite Konvertierung eines Referenztyps in einen Werttyp. Unboxing ruft einen Verweis auf den in einem Objekt enthaltenen Werttyp ab. Bei einer Unboxing-Operation wird die Objektinstanz überprüft, um sicherzustellen, dass die Instanz des Objekts ein eingerahmter Wert des angegebenen Werttyps ist. Dann wird der Wert aus der Instanz in die Werttypvariable kopiert.

**

Unboxing gibt einen Zeiger auf die Daten innerhalb eines Box-Objekt und keine Kopie der Daten erstellen.

**

ich wirklich die Linie nicht verstehen, dass ich hervorgehoben. es sagt, dass wenn Boxed Objekt unboxing, erstellt es keine Kopie, es gibt nur einen Zeiger zurück. Wenn das wahr ist, wird eine Werttypvariable in Heap zugewiesen, oder?

Ram

Antwort

9

Nun, es ist wahr, aber nicht das ganze Bild.

Das Unboxing selbst gibt nur einen Zeiger auf die Daten zurück, aber Sie können damit nicht auf die Daten in C# zugreifen. Wenn Sie einen Wert in C# deaktiviert haben, kopieren Sie ihn immer irgendwo.

Beispiel:

object o = 42; //box 
int i = (int)o; //unbox 

Die unboxing iself erhält den Zeiger auf den Wert in dem Objekt 42o, dann wird der Wert in die Variable i kopiert wird.

+0

Das macht Sinn. Vielen Dank – RAM

+0

Gibt es irgendwo den Zeiger auf den ungekasten Wert kann direkt verwendet werden, ohne den Wert zu kopieren? – RAM

+1

@RAM: Ich denke nicht, zumindest nicht so einfach. Vielleicht können Sie 'fixed' verwenden, um das Objekt im Speicher anzuheften, und einen Zeiger auf den Wert erhalten, aber das wäre viel komplizierter als nur den Wert zu kopieren. Die Werte, die gerahmt werden, sind klein. Es gibt also keinen Grund, das Kopieren zu vermeiden. – Guffa

14

Zusätzlich zu dem, was Guffa sagte, hier einige zusätzliche Informationen:

  • Die „Unboxing“ Operation durch den Text, den Sie die Anweisung unbox CIL beschreibt zitiert beschrieben. Der CIL-Standard hat dies zu sagen über unbox:

    Im Gegensatz zu box, die eine Kopie eines Werttypen für den Einsatz machen im Objekt erforderlich ist, unbox ist nicht erforderlich den Wert kopieren Geben Sie aus dem Objekt ein. Typischerweise berechnet er einfach die Adresse des Werttyp, bereits vorhandene Innenseite des geschachtelt Objekt

  • Die unboxing Conversions in C# verwenden, sind nicht zu unbox zusammengestellt. Sie werden zu einer anderen Anweisung mit der Bezeichnung unbox.any kompiliert:

    [...] Die Anweisung unbox.any extrahiert den in Obj enthaltenen Wert (vom Typ O). (Es ist äquivalent zu unbox gefolgt von ldobj.)

    In Englisch bedeutet dies unbox.any funktioniert eine unboxing Operation (unbox) - die schiebt einen Zeiger in dem Auswertungsstapel - gefolgt von dem Kopiervorgang (ldobj) , der den Zeiger auf den tatsächlichen Wert umwandelt, der im Werttyp enthalten ist, und ihn stattdessen auf den Auswertungsstapel verschiebt.

    Der Vollständigkeit halber hier ist die Beschreibung der ldobj:

    Die ldobj Befehl kopiert einen Wert auf dem Auswertungsstapel. [...] src ist ein nicht verwalteter Zeiger (native int) oder ein verwalteter Zeiger (&). [0]

    [Begründung: Die ldobj Anweisung kann verwendet werden, um einen Werttyp als ein Argument übergeben. Ende Begründung]

Soweit ich weiß, die C# -Compiler nie unbox oder ldobj verwendet, es unbox.any verwendet immer Unboxing zu tun, und ldind.* zu dereferenzieren Referenzen (wie ref/out Parameter).

+1

sehr klare Erklärung. Aus den Antworten von Ihnen und Guffa verstehe ich eindeutig Unboxing. Danke für deine großartige Erklärung und Zeit - Ram – RAM

Verwandte Themen