Frage

Mögliche Duplikate:
Warum brauchen wir Boxen und Unboxen in C#?
Was ist Boxen und Unboxen und was sind die Kompromisse?

Was bedeutet in C#: "Box und Unbox"?

Hier ein Auszug aus MSDN, bei dem ich den Text gegründet habe.

Aber diese Bequemlichkeit ist kostenlos. Jede Referenz- oder Werttyp, die einer ArrayList hinzugefügt wird, ist implizit auf Objekt aufgerichtet. Wenn die Elemente Werttypen sind, müssen sie unterbrochen werden, wenn sie zur Liste hinzugefügt werden, und bei der Abnahme von Boxen entlassen werden. Sowohl das Casting als auch das Box- und Unboxing -Vorgänge verringern die Leistung; Der Effekt von Boxen und Unboxen kann in Szenarien, in denen Sie über große Sammlungen iterieren müssen, sehr wichtig sein.

Vielen Dank!

War es hilfreich?

Lösung

Hier finden Sie eine detailliertere Erklärung, die die interne Sprachlaufzeit untersucht.

Machen wir zunächst den Unterschied zwischen Werttypen und Referenztypen:

  • Ein Werttyp wird auf dem gehalten Stapel und eine Kopie davon wird an genannte Methoden übergeben
  • Ein Referenzwert wird in der gehalten Managed Heap und der Stapel enthält nur einen Zeiger (Referenz) auf seinen Standort. Der Ort und nicht das Objekt wird an genannte Methoden übergeben

Wenn Sie nicht wissen, was der Stapel ist (sei nicht beleidigt) return Anweisung (nur kurz und eine allgemeine Antwort geben). Wenn Sie eine Methode aufrufen, ist ein ausreichender Bereich auf dem Stapel statisch Daher wird die Stapelzuweisung immer als statische Zuordnung bezeichnet.

Der Haufen ist stattdessen ein Speicherbereich, der vom Stapel getrennt ist. Eigentum des laufenden Prozesses, in dem die Zuordnung zuerst an das Betriebssystem gefordert werden muss, und deshalb heißt sie dynamische Zuweisung (Wenn Sie beispielsweise nicht in einer IF -Anweisung ausgeführt werden, wird der Speicher möglicherweise nicht für Ihren Prozess zugewiesen, stattdessen wird Stack immer zugewiesen.)

Nur um ein letztes Beispiel für Heap und Stack zu geben: in Sprachen wie C ++, deklarieren Sie int[100] a; Zuordnt statisch 100*8 Bytes auf dem Stapel (64-Bit-System angenommen), während int* a = new int[100]; Erklärt einen Bereich von 8 Bytes (auf 64-Bit-Systemen) auf dem Stapel und fordert 800 weitere Bytes auf dem Haufen an, falls und wo verfügbar.

Lassen Sie uns jetzt über C#sprechen:

Boxen

Da int ein Werttyp ist und auf dem Stapel zugewiesen wird, wenn Sie ihn an Objekt oder einen anderen Referenztyp werfen (tatsächlich gibt es keinen anderen Referenztyp, aus dem INT erben kann, aber es ist eine allgemeine Regel), muss der Wert notwendigerweise werden ein Referenztyp. Es wird also ein neuer Bereich auf dem Haufen zugewiesen, das Objekt ist Boxed darin und der Stapel hält einen Zeiger darauf.

Unboxing

Genau das Gegenteil: Wenn Sie einen Referenztyp wie das Objekt haben und ihn auf einen Werttyp werfen möchten, z. Unbekugeln Der Wert und kopiert ihn in den Stapel.

Mit anderen Worten

Denken Sie an die int[] und int* Beispiele? Einfach, wenn Sie haben int In C#erwartet die Laufzeit ihren Stapelstandort den Wert halten aber stattdessen, wenn Sie haben object, Es wird erwartet, dass sein echter Wert im Haufen des Stapels liegt.

Andere Tipps

Es gibt zwei verschiedene Typen im .NET -Framework.

Wertetypenwie int, doppelt, Single

ReferencetypenArrayList -Liste und viele, viele mehr

Variablen vom Typ Wertetypen werden in Stack gelagertReferencetyp Variablen werden in Haufen gespeichert

Variablen vom Typ Wertetypen Speichern Sie den WertReferencetyp Variablen speichern die Referenz auf einen Wert

Also, wenn Sie a kopieren Werttyp Variable - Es gibt a Echte Kopie eines Wertes, aber wenn Sie a kopieren Referenztyp Variable - Sie erhalten eine Zusätzliche Referenz zur gleichen Variablen.

Das Boxen in Ihrer Frage bedeutet, dass eine Variable (z. B. int) gemocht wird eine Referenztypvariable - .NET gibt es zu einem neuen Kasten. Es wird also innerhalb des Haufens eingekapselt und es wird Referenzen darauf geben.

Falls Sie möchten, dass der Wert wieder in einer Variablenvariable ist, die Sie müssen Unbox Es (nimm es aus der Schachtel). Der Wert wird also aus dem Haufen genommen und dem Stapel wieder gespeichert/gegeben.

ArrayList speichert nur Objekte. Als Referenztyp (wie String) Dies ist kein Problem, aber für einen Wertetyp (int, datetime, ..) ist es.

Diese Wertschöpfung müssen in ein Objekt umgewandelt werden, bevor Sie sie als einfaches Objekt speichern können. Dieses "Konvertieren in Objekt" heißt "Boxen" und dauert ein wenig Zeit.

Wenn Sie den Wert zurück lesen int (oder was auch immer es war). Dies nennt man "Unboxing".

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