Question

Une autre question récente interview C # j'avais été si je savais ce qui est de boxe et unboxing. Je lui ai expliqué que les types de valeur sont sur la pile et les types de référence sur Heap. Lorsqu'une valeur est coulée à un type de référence, nous l'appelons la boxe et vice-versa.

Alors il m'a demandé de calculer ceci:

int i = 20;
object j = i;
j = 50;

Qu'est-ce que i?

Je foiré et dit 50, où le fait 20. Maintenant, je pense comprendre pourquoi, mais quand je jouais avec différentes combinaisons je fus surpris de voir ceci:

Object a = 1; // Boxing
Object b = a; // referencing the pointer on stack to both objects on heap
a = 2; // Boxing

Je me attendais à voir b == 2 aussi bien, mais ce n'est pas, pourquoi? Est-ce parce que la deuxième détruit la boxe et remplace l'ensemble objet a sur le tas?

Parce que si je fais ça, il est très bien:

public class TT
{
    public int x;
}

TT t = new TT();
t.x = 1;
TT t2 = new TT();
t2.x = 2;
t = t2;
t.x = 3;

Qu'est-ce que t2.x? Il devrait être 3, et il est. Mais ce n'est pas un exemple de la boxe / unboxing du tout, cela est exact? Alors, comment résumeriez-vous cela?

les valeurs-être toujours le même dans une conversion de boxe / unboxing comme ci-dessus?

Était-ce utile?

La solution

  1. Vous avez raison la deuxième affectation remplace la première. Il ne change pas la valeur boxed.

  2. Votre exemple ne fait pas usage de la boxe. La valeur (int) est stockée comme un int et non en boîte.

  3. Non, la boxe conserve toujours la garantie immuabilité.

Autres conseils

Très court: des moyens de boxe créer une nouvelle instance d'un type de référence . Si vous savez cela, vous comprenez qu'une instance ne change pas en créant un autre.

Qu'est-ce que vous faites avec a = 2 ne change pas la valeur de la « boîte », vous créez une nouvelle instance d'un type de référence. Alors pourquoi tout changement d'autre?

  

Je me attendais à voir b == 2 et,   mais ce n'est pas, pourquoi? est-ce parce que le   deuxième boxe détruit et remplace   l'ensemble (a) -object sur tas?

Non, pas exactement. Il laisse l'objet tel qu'il est sur le tas (comme la variable b fait référence aussi) et crée un nouvel objet pour la nouvelle valeur, la variable a fera référence.

Vous avez raison que votre deuxième exemple ne pas utiliser la boxe. Vous ne pouvez pas accéder à une valeur qui est emballé de toute autre manière que unboxing, donc il n'y a aucun moyen de changer une valeur boxed.

Pas même un struct mutable comme Point peut être modifié lorsque boxed. Pour accéder aux propriétés de la struct vous devez Unbox, donc vous ne pouvez pas changer la struct boîte en place.

Voici une autre variante intéressante qui prend en charge les commentaires de Stefan:

        int i = 2;
        object a = i; // Boxing
        object b = a; // Referencing same address on heap as 'a', b == a

        b = i; // New boxing on heap with reference new address, b != a

b est encore parce que 1 b est une référence qui pointe encore à l'objet sur le tas avec une valeur de 1. 2 est parce que vous lui avez attribué à un nouvel objet sur le tas avec une valeur de 2.

t2.x est 3 parce que t et t2 sont deux références différentes pour le même objet sur le tas.

Je pense que la réponse à votre question est que unboxing: Le résultat d'une conversion unboxing est une variable temporaire (plus de détails: lien ).

Je pense que vous essayez de faire qqch comme:

object a = new Point(10,10);
object b = new Point(20,20);
a = b;

((Point) b).X = 30; //after this operation also a.X should be 30

Le code ci-dessus ne sera pas compilé - détails dans le lien ci-dessus, et je pense que ceci est la réponse à votre question:

  

Je me attendais à voir b == 2 et,   mais ce n'est pas, pourquoi? est-ce parce que le   deuxième boxe détruit et remplace   l'ensemble (a) -object sur tas?

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