Boxe e Unboxing, por que as saídas não são "System.Object"?
Pergunta
Eu tenho o seguinte código:
object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());
A saída é:
System.Int32
System.Object
Por que eles não são ambos System.Object
?
Solução
Se você está perguntando por que o boxedObject.getType () não retorna objeto .. Confira a imagem na seção 'Conversão de boxe' no Página de boxe e unboxing msdn. Boa pergunta btw .. pelo menos minha compreensão de sua pergunta.
Embora eu possa não estar tecnicamente correto, parece
- Quando movido para a pilha, um novo objeto é criado - seu ponteiro de tipo definido para o objeto de tipo de valor original (aqui System.int32). Isso explica getType () (e também o erro se você tentar dividi -lo para um tipo diferente).
- O valor real é então copiado para esse objeto.
Outras dicas
o GetType()
A função retorna o tipo real da instância na variável.
Mesmo que sua variável seja declarada como object
, na verdade é segurando uma caixa Int32
instância.
Ignorando o tópico do boxe, todas as classes herdam do objeto Type. Isso é verdade para tipos de referência e tipos de valor. GetType mostra o tipo mais derivado, que neste caso é System.int32.
Uma das poucas vezes que GetType retornará System.Object é se você fizer isso:
object var = new Object();
Console.WriteLine(var.GetType().ToString());
O boxe refere -se quando um tipo de valor é apontado por um tipo de referência. Geralmente isso é feito como um sistema. O tipo de retornará o tipo real mais derivado, não o tipo de referência.
class A
{
}
class B : A
{
}
class C : B
{
}
object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();
Gettype fará coisas semelhantes para esses tipos.
System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());
Classe A
Classb
Classc
Isso não é realmente sobre boxe; isso é sobre o comportamento de GetType
. Ele retorna o tipo de valor da variável, não do tipo que a variável era declarado com:
object var4 = new List<string>();
Console.WriteLine(var4.GetType().ToString());
não voltará System.Object
qualquer.
As declarações de variável são informações apenas para compilar, enquanto a execução do método é o tempo de execução. Em outras palavras, não há como getType () pode saber que tipo o objeto foi declarado, pois só pode saber o tipo real do objeto em tempo de execução.
semelhante se você tivesse
class a
{
}
class b : a
a bInstance = new b();
bInstance.GetType();
A chamada para binstance.gettype () não tem como saber que a variável foi declarada como tipo 'a' e acho que você também não espera que ela retorne 'a'. No entanto, no exemplo acima, a minha abreviação de objeto e B é para sistema.Int32