2012-04-14 6 views
5

Ho cercato di capire questo punto, ma in qualche modo non riuscivo a virtualizzare nella mia mente, qualcuno si prega di elaborarla po ':Unboxing Valori Tipi da oggetti

unboxing non è l'esatto contrario di boxe. L'operazione di disinserimento è molto meno costosa della boxe. Unboxing è in realtà solo l'operazione di ottenere un puntatore al tipo di valore non elaborato (campi dati) contenuto nello all'interno di un oggetto. In effetti, il puntatore si riferisce alla porzione non registrata nell'istanza box. Pertanto, a differenza della boxing, l'annullamento della prenotazione non comporta la copia di byte in memoria. Dopo aver apportato questo importante chiarimento , è importante notare che un'operazione di annullamento automatico è seguita in genere dalla copia dei campi.

Richter, Jeffrey (2010-02-05). CLR via C# (Posizioni Kindle 4167-4171). OReilly Media - A. Edizione Kindle.

+0

ha avuto esattamente la stessa domanda durante la lettura del paragrafo – zinking

risposta

6

Per inserire un int è necessario creare un oggetto sull'heap abbastanza grande da contenere tutti i dati contenuti nella struttura. Assegnare un nuovo oggetto all'heap significa lavorare affinché il GC trovi un punto e lavorare per il GC per pulirlo/spostarlo durante e dopo la sua vita. Queste operazioni, pur non essendo costose super, non sono neanche economiche.

Per annullare la selezione di un tipo di valore, tutto ciò che si sta facendo è de-referenziare il puntatore, per così dire. Hai semplicemente bisogno di guardare il riferimento (che è quello che è lo object) per trovare la posizione dei valori attuali. Cercare un valore nella memoria è molto economico, motivo per cui quel paragrafo dice che "unboxing" è economico.

Aggiornamento:

Mentre un tipo di valore unboxed di solito essere copiato in un'altra posizione dopo essere unboxed, che non è sempre il caso. Si consideri il seguente esempio:

public struct MyStruct 
{ 
    private int value = 42; 
    public void Foo() 
    { 
    Console.WriteLine(value); 
    } 
} 

static void Main() 
{ 
    object obj = new MyStruct(); 
    ((MyStruct)obj).Foo(); 
} 

Il MyStruct è inscatolato in obj ma quando è unboxed non è mai copiato da nessuna parte, un metodo è semplicemente richiamato su di esso. Allo stesso modo è possibile estrarre una proprietà/campo dalla struttura e copiare solo quella parte senza dover copiare tutto. Questo potrebbe sembrare un po 'forzato, ma non è ancora del tutto assurdo. Detto questo, come suggerisce la tua citazione, è ancora probabile che copi la struttura dopo averla chiusa.

+0

Ma dopo aver trovato i valori, i valori verranno copiati nello Stack, è corretto? – Tarik

+0

@Braveyard No, non lo è. È piuttosto comune che una volta che il valore viene rimosso, verrà copiato, ma non è necessario. Inoltre, potrebbe non essere copiato nello stack, potrebbe essere copiato in un campo di un altro tipo di riferimento sull'heap. – Servy

+0

Ho aggiunto un esempio di codice alla risposta. – Servy