Domanda

Un altro recente questione C # intervista che avevo era se sapessi cosa Boxing e unboxing è. Ho spiegato che i tipi di valore sono in Pila e tipi di riferimento sul mucchio. Quando un valore viene colato ad un tipo di riferimento, noi chiamiamo boxe e viceversa.

Poi mi ha chiesto di calcolare questo:

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

Qual è i?

ho messo su e detto 50, dove la sua realtà 20. Ora penso capire il motivo per cui, tuttavia quando stavo giocando con diverse combinazioni sono stato sorpreso di vedere questo:

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

Mi aspettavo di vedere b == 2 pure, ma non lo è, perché? E 'perché il secondo boxe distrugge e sostituisce l'intero oggetto a sul mucchio?

Perché se faccio questo, va bene:

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;

Che cosa è t2.x? Dovrebbe essere 3, e lo è. Ma questo non è un esempio della boxe / unboxing a tutti, è corretto? Così come è possibile riassumere questo?

i valori potrebbero mai diventare la stessa in un incontro di boxe / conversione unboxing come sopra?

È stato utile?

Soluzione

  1. Hai ragione la seconda assegnazione sostituisce il primo. Non cambia il valore boxed.

  2. Il tuo esempio non fa uso della boxe. Il valore (int) è memorizzato come un int e non in scatola.

  3. No, la boxe conserva ancora la garanzia immutabilità.

Altri suggerimenti

molto brevi: boxe mezzi creare una nuova istanza di un tipo di riferimento . Se conosci questa, si capisce che un caso non cambia con la creazione di un altro.

Che cosa si sta facendo con a = 2 non cambia il valore della 'scatola', si sta creando una nuova istanza di un tipo di riferimento. Allora perché dovrebbe qualsiasi altra cosa il cambiamento?

  

Mi aspettavo di vedere b == 2, come pure,   ma non lo è, perché? è perché la   secondo la boxe distrugge e sostituisce   il tutto (a) -oggetto sul mucchio?

No, non esattamente. Lascia l'oggetto come è sull'heap (come variabile b anche riferimento a esso) e crea un nuovo oggetto per il nuovo valore, che farà riferimento variabile a.

Hai ragione che il secondo esempio non usa la boxe. Non è possibile accedere a un valore che viene confezionato in altro modo se non unboxing esso, quindi non c'è modo di cambiare un valore boxed.

Nemmeno una struttura mutevole come Point può essere modificato quando boxed. Per accedere alle proprietà della struct avete di unboxing, quindi non è possibile modificare lo struct in scatola al suo posto.

Ecco un altro interessante variante che supporta i commenti di 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 è ancora 1 perché b è un riferimento che ancora punta all'oggetto sul mucchio con un valore di 1. un 2 perché è assegnato a un nuovo oggetto sul mucchio con un valore di 2.

t2.x è 3 perché t e t2 sono due differenti riferimenti allo stesso oggetto sul mucchio.

Penso che la risposta alla tua domanda con unboxing è che: Il risultato di una conversione unboxing è una variabile temporanea (maggiori dettagli: link ).

Credo che si stava tentando di fare qc come:

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

Il codice di cui sopra non compilerà - dettagli nel link qui sotto, e credo che questa è la risposta alla tua domanda:

  

Mi aspettavo di vedere b == 2, come pure,   ma non lo è, perché? è perché la   secondo la boxe distrugge e sostituisce   il tutto (a) -oggetto sul mucchio?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top