2011-01-17 6 views
2

Von MSDN habe ich gelesen, dass Boxen/Unboxing ist für die Behandlung Wert Typen als Objekte. Aber wenn ich über ArrayList lese, liest es, dass es auch Boxen tut. Ich bin also ziemlich verwirrt, da ArrayList Werte und Referenztypen als Objekte enthält. Auch das Folgende ist nicht in Bezug auf Terminologie unboxing, seine Casting einfach?Boxing/Unboxing - nur Werttypen? Ref.types - Gießen?

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

someClass x=(someClass)a[0]; 
+1

'ArrayList' ist irgendwie veraltet von' List 'http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx –

Antwort

8

ArrayList führt Boxen für Werttypen, aber nicht Typen verweisen. Oder eher, ArrayList selbst macht nicht das Boxen - der Compiler tut. Zum Beispiel:

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

ist effektiv

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 Referenzkonvertierung, keine Unboxing-Konvertierung. Ein Referenztyp-Wert muss nicht eingerahmt werden, um in einem ArrayList gespeichert zu werden - es ist bereits eine Referenz.

Auch dies gilt für Boxen im Allgemeinen und nicht spezifisch für ArrayList. Boxing ist nur eine Möglichkeit zur Verwendung eines Werttyps Wert, wo Sie wirklich wollen eine Referenz ... eine Referenz zu einem Objekt sein muss, so erstellt die CLR ein Objekt den Wert Wert Wert umbrechen, und gibt einen Verweis darauf zurück Wrapper (die "Box" speichert den Wert).

2

Boxing/Unboxing ist eine Eigenschaft der Sprache und der Laufzeit, kein Merkmal von ArrayList. Locker gesagt, it's the conversion of a value type from/to the Object type, und seit ArrayList nimmt Object s, jede Werttypen, die Sie übergeben, wird automatisch mit der box IL-Anweisung Boxed.

Genauer gesagt umfasst Boxen/Unboxing das Erstellen oder Untersuchen eines neuen Objekts und das Kopieren der Daten des Werttyps vom Stapel auf den Heap (oder umgekehrt). Es ist ziemlich teuer, und Sie möchten es, wenn möglich, vermeiden.

Bei Referenztypen wird normalerweise kein Boxcode generiert; jede unbox-Anweisung, die mit einem Referenztyp arbeitet, wird außerdem einfach ignoriert.

+0

in wpf kann man mit Abhängigkeitseigenschaften nicht ... – GorillaApe

0

Ich finde es nützlich, an Werttypen als außerhalb des Klassentypsystems zu denken, aber betrachte jeden Werttyp als einen unsichtbaren entsprechenden Referenztyp, abgeleitet von ValueType (der wiederum von Object abgeleitet ist), der sich im Wesentlichen wie eine Klasse verhält mit den gleichen Mitgliedern wie Foo, unterstützt aber die Erweiterung von Umwandlungen zum und vom realen Werttyp.

Wenn ein Werttyp an Code übergeben wird, der eine Ableitung von Object erwartet, wird er in den entsprechenden unsichtbaren Referenztyp umgewandelt. Wenn ein Objekt dieses Referenztyps einer Variablen des Werttyps zugewiesen wird, wird es zurückgeworfen.

BTW, wenn ich meine druthers hatte, würde es eine Möglichkeit geben, anzugeben, dass etwas anderes als die Standard-Casting-Methode verwendet werden sollte, aber keine solche Funktion existiert.