2010-08-10 10 views
8

Ich habe den folgenden Code:Boxen und Unboxing, warum sind die Ausgänge nicht beide "System.Object"?

object var3 = 3; 
Console.WriteLine(var3.GetType().ToString()); 
Console.WriteLine(typeof(object).ToString()); 

Die Ausgabe lautet:

System.Int32 
System.Object 

Warum sind sie nicht beide System.Object?

+0

@Also OP, Beide Console.WriteLines würde funktionieren, auch ohne die explizite ToString() - es würde implizit aufgerufen, wenn Ihr Argument Typ ist ein Objekt. – Gishu

+0

entfernt Anrede: "Danke im Voraus.", Entfernte auch illegale Wörter aus Titel: "Frage über", nicht das nächste Mal –

Antwort

4

Wenn Sie sich fragen, warum die boxedObject.GetType() Objekt nicht zurück .. Überprüfen Sie das Bild unter dem ‚Boxing Conversion‘ Abschnitt aus auf dem MSDN Boxing and Unboxing page. Gute Frage übrigens ... zumindest mein Verständnis für deine Frage.

Obwohl ich nicht technisch korrekt sein mag, es sieht aus wie

  • Wenn auf die Halde bewegt, ein neues Objekt erstellt wird - seine Art Zeiger auf den ursprünglichen Typ des Objekts Werttyp (hier vorhanden. 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.
7

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

Obwohl Ihre Variable als object deklariert ist, ist es tatsächlich mit eine Box Int32 Instanz.

+0

Ich habe keine Ahnung, was die anderen Antworten zu beweisen versuchen :) – leppie

+1

Ich denke, seine Frage Warum gibt der GetType der Box (das Objekt) Int32 (den Typ des Boxed-Werts) anstelle von Object zurück - da das Boxen bewirkt, dass ein Objekt auf dem Heap erstellt wird. Wenn nicht, erhalten Sie eine +1 – Gishu

+0

@leppie: Es gibt sicher eine Menge von ihnen, sind nicht da :) –

3

Beim Ignorieren des Themas Boxen 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.

Eines der wenigen Male GetType System.Object zurückkehren wird, wenn Sie dies tun:

object var = new Object(); 
Console.WriteLine(var.GetType().ToString()); 

Boxen bezieht, wenn ein Werttyp durch eine zu Referenztyp gerichtet ist. 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.

class A 
{ 
} 

class B : A 
{ 
} 

class C : B 
{ 
} 

object obj1 = new ClassA(); 
ClassB obj2 = new ClassB(); 
ClassB obj3 = new ClassC(); 

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

System.Console.WriteLine(obj1.GetType().ToString()); 
System.Console.WriteLine(obj2.GetType().ToString()); 
System.Console.WriteLine(obj3.GetType().ToString()); 

KlasseA
ClassB
ClassC

+0

Werttypen sind nicht wirklich von Objekt abgeleitet. Sie sind vollständig außerhalb der Typhierarchie. Für jeden Werttyp gibt es jedoch einen Klassentyp, der von dem ironisch benannten ValueType abgeleitet ist (trotz seines Namens ist es ein Klassentyp). Das System definiert implizite bidirektionale Konvertierungsoperatoren zwischen jedem Werttyp und seinem entsprechenden automatisch generierten Klassentyp. Die implizite Konvertierung von einem Werttyp in einen Klassentyp wird "Boxen" genannt; Die umgekehrte Konvertierung ist "Unboxing". – supercat

+0

@supercat: Fühlen Sie sich frei, die Antwort zu bearbeiten, wenn Sie möchten :) –

1

Diese über das Boxen nicht wirklich ist; Dies ist das Verhalten von GetType. Es gibt den Typ des Wert der Variablen, nicht der Typ der Variable war erklärt mit:

object var4 = new List<string>(); 
    Console.WriteLine(var4.GetType().ToString()); 

wird System.Object entweder nicht zurück.

+0

Es wird den Typ der Instanz, nicht den Typ der Referenz zurückgeben –

1

Deklarationen der Variablen sind nur Informationen zur Kompilierzeit, während die Methodenausführung 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

class a 
{ 
} 

class b : a 

a bInstance = new b(); 
bInstance.GetType(); 

den Anruf zu bInstance.GetType() hatte keine Möglichkeit zu wissen, dass die Variable als Typ ‚a‘ erklärt wurde, und ich glaube nicht, dass Sie es zurück erwarten ' a 'in diesem Fall auch nicht. Aber im obigen Beispiel ist a meine Abkürzung für Objekt und b ist für System.Int32