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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top