Frage

Von MSDN ich, dass der Boxsport lesen / Unboxing ist für die Behandlung von Wert Typen als Objekte. Aber wenn ich über Arraylist zu lesen, liest es, dass es so gut ist Boxen. Also ich ganz verwirrt bin als Arraylist hält Wert und Referenztypen als Objekte. Auch die folgenden wird Unboxing nicht in Bezug auf die Terminologie, es ist nur Gießen?

ArrayList a=new ArrayList();
a.Add(someClass);

someClass x=(someClass)a[0];
War es hilfreich?

Lösung

ArrayList führt Boxen für Werttypen, aber nicht Referenztypen. Oder besser gesagt, ArrayList selbst nicht die Boxen tut - der Compiler tut. Zum Beispiel:

ArrayList list = new ArrayList();
list.Add(5);

ist wirksam

ArrayList list = new ArrayList();
object boxed = 5; // Perform boxing from value type type
list.Add(boxed);

Ihr Beispiel ist in der Tat nur Gießen - eine Referenz-Konvertierung, keine Unboxing-Konvertierung. Ein Wert Referenztyp muss nicht geboxt wurde in einer ArrayList gespeichert werden. - es ist bereits eine Referenz

Auch die in der Regel gilt für Boxen, und nicht spezifisch für ArrayList. Box sind nur ein Weg, einen Werttyp Wert mit dem Sie wirklich will eine Referenz ... eine Referenz auf ein Objekt sein muss, so dass der CLR ein Objekt erstellt den Werttyp Wert zu wickeln, und gibt einen Verweis auf diesen Wrapper (die „Box“, um den Wert zu speichern).

Andere Tipps

Boxen / Unboxing ist ein Merkmal der Sprache und der Laufzeit, kein Merkmal von ArrayList. Grob gesagt, es ist die Umwandlung eines Werttypen vom / zum Object Typ , und da ArrayList in Objects nimmt, werden Sie keine Werttypen übergeben automatisch mit der box IL Anweisung geschachtelt werden.

Insbesondere Boxen / unboxing umfasst das Erstellen oder ein neues Objekt der Prüfung, und das Kopieren der Daten des Werttyp von dem Stapel zu dem Heap (oder umgekehrt). Es ist ziemlich teuer, und Sie mögen, dass es vermeiden, wenn möglich.

Im Fall von Referenztypen wird kein Box-Code normal erzeugt; jede unbox Anweisung, die auf einem Referenztyp arbeitet, ist darüber hinaus einfach ignoriert.

Ich finde es nützlich Werttypen zu denken, wie außerhalb des Klassentypen System zu sein, aber jeden Werttyp betrachte einen unsichtbaren entsprechenden Referenztyp als mit von Valuetype abgeleitet (was wiederum stammt von Object), die im Wesentlichen als eine Klasse verhält sie mit die gleichen Elemente wie Foo, sondern unterstützt Abgüsse vom und zum realen Wert Typ erweitert wird.

Wenn ein Werttyp ist an Code übergeben, die ein Derivat von Object erwartet, wird es gegossen in den entsprechenden unsichtbaren Referenztyp sein; wenn ein Objekt dieses Referenztypen eine Variable vom Werttyp zugeordnet ist, wird er zurückgeworfen werden.

Übrigens, wenn ich meine druthers hatte, es wäre eine Möglichkeit der, dass etwas anderes als das Standard Gießverfahren Angabe sollte verwendet werden, aber keine solche Funktion vorhanden ist.

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