2010-08-10 9 views
8

que tiene el siguiente código:boxeo y unboxing, ¿por qué las salidas no son "System.Object"?

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

La salida es:

System.Int32 
System.Object 

Por qué no son tanto System.Object?

+0

@Also OP, ambas Console.WriteLines funcionarían, incluso sin el ToString explícito(): se llamaría implícitamente si su argumento tipo es un Objeto. – Gishu

+0

eliminado saludo: "Gracias de antemano.", También eliminó las palabras ilegales del título: "Pregunta sobre", no hagas eso la próxima vez –

Respuesta

4

si estás preguntando por qué el boxedObject.GetType() no devuelve objetos .. salida la imagen bajo la sección 'Conversión de Boxeo' en la MSDN Boxing and Unboxing page. Buena pregunta por cierto ... al menos mi comprensión de su pregunta.

Aunque puede que no sea técnicamente correcto, parece que

  • Cuando se trasladó a la pila, se crea un nuevo objeto - su puntero Tipo como objeto Type de tipo valor original (en este sistema. Int32). Esto explica GetType() (y también el error si intentas desempaquetarlo en un tipo diferente).
  • El valor real se copia en este objeto.
7

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 sosteniendo una caja Int32 ejemplo.

+0

No tengo idea de qué intentan probar las otras respuestas :) – leppie

+1

Creo que su pregunta es por qué GetType (el objeto) devuelve Int32 (el tipo del valor encuadrado) en lugar de Object, ya que el boxeo hace que cree un objeto en el montón. Si no, obtienes un +1 – Gishu

+0

@leppie: seguro que hay muchos de ellos, ¿no? :) –

3

Ignorando el tema del boxeo, todas las clases heredan de tipo objeto. Esto es cierto tanto para los tipos de referencia como para los tipos de valor. GetType muestra el tipo más derivado, 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()); 

boxeo, cuando se refiere a un tipo de valor es apuntado por un tipo de referencia. En general esto se hace como referencia de System.Object. TypeOf devolverá el tipo real más derivado, 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

+0

Los tipos de valores realmente no se derivan de Object. Están completamente fuera de la jerarquía de tipos. Para cada tipo de valor, sin embargo, hay un tipo de clase que deriva del ValueType irónico (a pesar de su nombre, es un tipo de clase). El sistema define operadores de conversión bidireccional implícitos entre cada tipo de valor y su tipo de clase autogenerado correspondiente. La conversión implícita de un tipo de valor a un tipo de clase se llama "boxeo"; la conversión inversa es "unboxing". – supercat

+0

@supercat: Siéntase libre de editar la respuesta si lo desea :) –

1

Esto no es realmente sobre el boxeo; esto es sobre el comportamiento de GetType. Devuelve el tipo del valor de la variable, no el tipo de la variable fue declarada con:

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

no volverá System.Object tampoco.

+0

Devolverá el tipo de instancia, no el tipo de la referencia –

1

declaraciones de variable es tiempo de compilación solo información mientras que la ejecución del método es tiempo de ejecución.En otras palabras, no hay manera de que GetType() sepa de qué tipo fue declarado el objeto, ya que solo puede conocer el tipo real del objeto en tiempo de ejecución.

similar si usted tenía

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 usted espera que vuelva ' a 'en este caso tampoco. Sin embargo, en el ejemplo anterior a es mi abreviación de objeto yb es para System.Int32

Cuestiones relacionadas