la boxe et unboxing, pourquoi ne sont pas les sorties à la fois « System.Object »?

StackOverflow https://stackoverflow.com/questions/3447315

  •  27-09-2019
  •  | 
  •  

Question

Je suis le code suivant:

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

La sortie est:

System.Int32
System.Object

Pourquoi sont-ils pas tous les deux System.Object?

Était-ce utile?

La solution

Si vous vous demandez pourquoi le boxedObject.GetType () ne retourne pas l'objet .. vérifier l'image sous la rubrique 'Boxe Conversion' MSDN boxe et page Unboxing . Bonne question btw .. atleast ma compréhension de votre question.

Bien que je ne sois pas techniquement correct, il ressemble à

  • Lorsque vous déplacez sur le tas, un nouvel objet est créé - son pointeur Type défini sur l'objet Type du type de valeur d'origine (ici System.Int32). Ceci explique GetType () (et aussi l'erreur si vous essayez de Unbox à un autre type).
  • La valeur réelle est alors copié dans cet objet.

Autres conseils

La fonction GetType() renvoie le type de l'instance réelle de la variable.

Même si votre variable est déclarée comme object, il est en fait maintenant une instance de Int32 boxed.

Ignorant le thème de la boxe, toutes les classes héritent de l'objet de type. Cela est vrai pour les deux types de référence et les types de valeurs. GetType montre le type le plus dérivé, qui dans ce cas est System.Int32.

L'une des rares fois GetType va revenir System.Object est si vous faites ceci:

object var = new Object();
Console.WriteLine(var.GetType().ToString());

Boxe se réfère à quand un type de valeur est pointée par un type de référence. En général, cela se fait comme référence System.Object. TypeOf renverra le type réel plus dérivé, pas le type de référence.

class A
{
}

class B : A
{
}

class C : B
{
}

object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();

GetType va faire des choses similaires pour ces types.

System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());
  

ClassA
ClassB
ClassC

Ce n'est pas vraiment sur la boxe; c'est le comportement de GetType. Il retourne le type de valeur de la variable, pas le type de la variable était a déclaré avec:

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

ne reviendra pas System.Object non plus.

déclarations de variable est la compilation d'information seulement alors que l'exécution du procédé est l'exécution. En d'autres termes, il n'y a pas de GetType façon () peut savoir quel type de l'objet a été déclarée comme il ne peut connaître le type réel de l'objet à l'exécution.

Dans le même si vous aviez

class a
{
}

class b : a

a bInstance = new b();
bInstance.GetType();

l'appel à bInstance.GetType () n'a aucun moyen de savoir que la variable a été déclarée en tant que type « a » et je ne pense pas que vous vous attendez à revenir « a » dans ce cas non plus. Cependant, dans l'exemple ci-dessus est mon abréviation de l'objet et b est pour System.Int32

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top