Boxing und Unboxing, warum sind die Ausgaben nicht beide "System.Object"?

8

Ich habe den folgenden Code:

%Vor%

Die Ausgabe ist:

%Vor%

Warum sind das nicht beide System.Object ?

    
smwikipedia 10.08.2010, 08:50
quelle

5 Antworten

4

Wenn Sie fragen, warum boxedObject.GetType () Object nicht zurückgibt. Sehen Sie sich das Bild im Abschnitt "Boxing Conversion" auf der MSDN Boxing und Unboxing Seite . Gute Frage übrigens ... zumindest mein Verständnis für deine Frage.

Obwohl ich technisch nicht korrekt bin, sieht es wie

aus
  • Beim Verschieben in den Heap wird ein neues Objekt erstellt - sein Type-Zeiger, der auf das Type-Objekt des ursprünglichen Wertetyps gesetzt ist (hier System.Int32). Dies erklärt GetType () (und auch den Fehler, wenn Sie versuchen, es auf einen anderen Typ zu entpacken).
  • Der tatsächliche Wert wird dann in dieses Objekt kopiert.
Gishu 10.08.2010, 09:10
quelle
7

Die Funktion GetType() gibt den tatsächlichen Typ der Instanz in der Variablen zurück.

Auch wenn Ihre Variable als object deklariert ist, ist es eigentlich , die eine eingerahmte Int32 -Instanz enthält.

    
SLaks 10.08.2010 08:51
quelle
3

Wenn Sie das Thema Boxen ignorieren, erben alle Klassen vom Typ Objekt. Dies gilt sowohl für Referenztypen als auch für Werttypen. GetType zeigt den am weitesten abgeleiteten Typ, in diesem Fall System.Int32.

Einer der wenigen Male, die GetType System.Object zurückgeben wird, wenn Sie dies tun:

%Vor%

Boxen bezieht sich darauf, wenn auf einen Wertetyp durch einen Referenztyp verwiesen wird. Im Allgemeinen wird dies als eine System.Object-Referenz ausgeführt. TypeOf gibt den am meisten abgeleiteten tatsächlichen Typ zurück, nicht den Referenztyp.

%Vor%

GetType wird ähnliche Dinge für diese Typen tun.

%Vor%
  

KlasseA
KlasseB
KlasseC

    
Merlyn Morgan-Graham 10.08.2010 08:53
quelle
1

Es geht nicht wirklich um Boxen; Hier geht es um das Verhalten von GetType . Es gibt den Typ des -Werts der Variablen zurück, nicht den Typ, für den die Variable deklariert ist:

%Vor%

gibt auch System.Object nicht zurück.

    
AakashM 10.08.2010 08:56
quelle
1

Deklarationen der Variablen sind nur Informationen zur Kompilierzeit, während die Ausführung der Methode die Laufzeit ist. Mit anderen Worten, GetType () kann nicht wissen, welchen Typ das Objekt deklariert hat, da es nur den tatsächlichen Typ des Objekts zur Laufzeit kennen kann.

ähnlich, wenn Sie

hatten %Vor%

Der Aufruf von bInstance.GetType () kann nicht wissen, dass die Variable als Typ 'a' deklariert wurde und ich denke nicht, dass Sie erwarten, dass sie auch in diesem Fall 'a' zurückgibt. Im obigen Beispiel ist jedoch a meine Abkürzung für Objekt und b ist für System.Int32

    
Rune FS 10.08.2010 09:36
quelle

Tags und Links