Boxen und Unboxing, warum sind nicht die Ausgaben sowohl „System.Object“?
Frage
Ich habe den folgenden Code:
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
?
Lösung
Wenn Sie sich fragen, warum die boxedObject.GetType () nicht Gegenstand zurückkehren .. Besuche das Bild unter dem Abschnitt 'Boxen Conversion' auf MSDN Boxen und Unboxing . Gute Frage btw .. atleast mein Verständnis für Ihre Frage.
Obwohl ich nicht technisch korrekt sein mag, es sieht aus wie
- Wenn auf die Halde bewegt, wird ein neues Objekt erstellt - seine Art Zeiger Satz hängt vom jeweiligen Original-Objekt Werttyp (hier System.Int32). Dies erklärt GetType () (und auch der Fehler, wenn Sie versuchen, es auf eine andere Art zu unbox).
- Der tatsächliche Wert wird dann in dieses Objekt kopiert.
Andere Tipps
Die GetType()
Funktion liefert den aktuellen Typen der Instanz in den Variablen.
Auch wenn Ihre Variable als object
deklariert wird, ist es eigentlich halten eine Box Int32
Instanz.
Das Ignorieren des Themas des Boxens, erbten alle Klassen vom Typ Objekt. Dies ist für beide Referenztypen und Werttypen wahr. GetType zeigt den am meisten abgeleiteten Typen, der in diesem Fall ist System.Int32.
Eines der wenigen Male GetType wird System.Object zurückgeben, wenn Sie dies tun:
object var = new Object();
Console.WriteLine(var.GetType().ToString());
Boxen beziehen sich auf, wenn ein Werttyp durch einen Referenztyp gerichtet ist. Im Allgemeinen wird dies als System.Object Referenz getan. TypeOf die meisten abgeleiteten tatsächlichen Typ zurückgeben, nicht der Referenztyp.
class A
{
}
class B : A
{
}
class C : B
{
}
object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();
GetType wird für diese Arten ähnliche Dinge tun.
System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());
KlasseA
ClassB
ClassC
Das ist nicht wirklich über das Boxen; dies ist über 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 nicht System.Object
entweder zurück.
Erklärungen Variable ist der Kompilierung nur Informationen während Methodenausführung Laufzeit ist. Mit anderen Worten gibt es keine Möglichkeit GetType () wissen kann, was den Objekttyp wurde erklärt, da es nur den tatsächlichen Typ des Objekts zur Laufzeit kennen kann.
ähnlich, wenn Sie hatte
class a
{
}
class b : a
a bInstance = new b();
bInstance.GetType();
der Aufruf von bInstance.GetType () haben keine Möglichkeit zu wissen, dass die Variable als Typ deklariert wurde ‚a‘ und ich glaube nicht, dass Sie es erwarten, zurückzukehren ‚a‘ in diesem Fall auch nicht. Jedoch in dem obigen Beispiel eine ist meine Abkürzung von Objekt und b wird für System.Int32