boxeo y unboxing, ¿por qué no son las salidas de ambos “System.Object”?
Pregunta
Tengo el siguiente código:
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
La salida es:
System.Int32
System.Object
¿Por qué no son los dos System.Object
?
Solución
Si estás preguntando por qué el boxedObject.GetType () no devuelve objetos .. echa un vistazo a la imagen en la sección 'Conversión de boxeo' en el MSDN boxeo y la página Unboxing . Buena pregunta .. por cierto al menos mi entendimiento de su pregunta.
A pesar de que yo no sea técnicamente correcto, parece que
- Cuando se trasladó a la pila, se crea un nuevo objeto - su conjunto de tipo puntero a objeto Type de tipo valor original (aquí System.Int32). Esto explica GetType () (y también el error si intenta unboxing a un tipo diferente).
- El valor real se copia a continuación, encima en este objeto.
Otros consejos
La función GetType()
devuelve el tipo real de la instancia en la variable.
A pesar de que la variable se declara como object
, en realidad es con capacidad una instancia Int32
en caja.
Sin hacer caso del tema del boxeo, todas las clases heredan de tipo de objeto. Esto es cierto para ambos tipos de referencia y los tipos de valor. GetType muestra el tipo más derivada, que en este caso es System.Int32.
Una de las pocas veces GetType va a volver System.Object es si usted hace esto:
object var = new Object();
Console.WriteLine(var.GetType().ToString());
Boxing se refiere a cuando un tipo de valor es apuntado por un tipo de referencia. Generalmente esto se hace como referencia System.Object. TypeOf devolverá el tipo real más derivada, no el tipo de referencia.
class A
{
}
class B : A
{
}
class C : B
{
}
object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();
GetType hará cosas similares para estos tipos.
System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());
claseA
ClassB
ClassC
Esto no es realmente sobre el boxeo; esto es sobre el comportamiento de GetType
. Devuelve el tipo de la valor de la variable, no el tipo de la variable fue declararon con:
object var4 = new List<string>();
Console.WriteLine(var4.GetType().ToString());
no volverá System.Object
tampoco.
declaraciones de variable es el tiempo de compilación sólo información mientras que la ejecución del método es el tiempo de ejecución. En otras palabras, no hay manera GetType () puede saber qué tipo es el objeto fue declarado ya que sólo puede conocer el tipo real del objeto en tiempo de ejecución.
similar si tuviera
class a
{
}
class b : a
a bInstance = new b();
bInstance.GetType();
la llamada a bInstance.GetType () no tienen manera de saber que la variable se declara como tipo 'a' y no creo que se puede esperar que vuelva 'a' en este caso tampoco. Sin embargo, en el ejemplo anterior a es mi abreviatura del objeto y b es para System.Int32