Boxen / Unboxing - nur Werttypen? Ref.types - Gießen?
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];
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 Object
s 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.