Boxe vs Unboxing

Une autre question récente de l'interview C# que j'avais était si je savais ce qu'est la boxe et le déballage. J'ai expliqué que les types de valeur sont sur la pile et les types de référence sur le tas. Lorsqu'une valeur est convertie en un type de référence, nous l'appelons la boxe et vice versa.

, Puis il m'a demandé de calculer ceci:

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

Qu'est-Ce que i?

Je l'ai foiré et dit 50, où c'est en fait 20. Maintenant, je pense comprendre pourquoi, mais quand je jouais avec différentes combinaisons, j'ai été surpris de voir ce:

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

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

Parce que si je fais ça, c'est 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 boxe / unboxing du tout, est-ce correct? Alors, comment résumeriez-vous cela?

Les valeurs pourraient-elles devenir les mêmes dans une conversion de boxe / unboxing comme ci-dessus?

28
demandé sur Sean Vieira 2009-04-19 01:10:18

6 réponses

  1. Vous avez raison la deuxième affectation remplace la première. Cela ne change pas la valeur en boîte.

  2. Votre exemple n'utilise pas la boxe. La valeur (int) est stockée en tant que int et non en boîte.

  3. Non, la boxe garde toujours la garantie d'immuabilité.

5
répondu grover 2009-04-18 21:12:45

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

Ce que vous faites avec a = 2 n'est pas de modifier la valeur dans la boîte, vous créez une nouvelle instance d'un type de référence. Alors, pourquoi quelque chose d'autre devrait changer?

8
répondu Stefan Steinegger 2009-04-18 22:55:43

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

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

Vous avez raison que votre deuxième exemple n'utilise pas la boxe. Vous ne pouvez pas accéder à une valeur qui est encadrée d'une autre manière que de le déballer, il n'y a donc aucun moyen de changer une valeur en boîte.

Même une structure mutable comme Point ne peut pas être modifiée lorsqu'elle est encadrée. Pour accéder aux propriétés de la structure, vous devez la décocher, de sorte que vous ne pouvez pas modifier la structure en boîte en place.

2
répondu Guffa 2009-04-18 21:34:29

Voici une autre variante intéressante qui soutient 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
2
répondu allthingscs 2012-07-12 18:24:38

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

T2.x vaut 3 CAR t et t2 sont deux références différentes au même objet sur le tas.

1
répondu Aaron Daniels 2009-04-18 21:38:54

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

Je pense que vous essayiez de faire sth 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 compilera pas-détails dans le lien ci-dessus, et je pense que c'est la réponse à votre question:

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

0
répondu empi 2009-04-18 22:27:13