Domanda

Da MSDN ho letto che la boxe / unboxing è per il trattamento di Valore tipi come oggetti. Ma quando ho letto di ArrayList, si legge che essa boxe pure. Quindi io sono abbastanza confuso come ArrayList ha un valore e tipi di riferimento come oggetti. Anche la seguente non è unboxing in termini di terminologia, il suo solo casting?

ArrayList a=new ArrayList();
a.Add(someClass);

someClass x=(someClass)a[0];
È stato utile?

Soluzione

ArrayList esegue boxe per i tipi di valore, ma non i tipi di riferimento. O meglio, ArrayList per sé non fa la boxe - il compilatore fa. Ad esempio:

ArrayList list = new ArrayList();
list.Add(5);

è efficace

ArrayList list = new ArrayList();
object boxed = 5; // Perform boxing from value type type
list.Add(boxed);

Il tuo esempio è infatti solo Casting - una conversione di riferimento, non una conversione unboxing. Un valore tipo di riferimento non ha bisogno di essere imballato per essere memorizzati in un ArrayList -. È già un punto di riferimento

Ancora una volta, questo è vero per la boxe in generale, e non specifiche per ArrayList. La boxe è solo un modo di utilizzare un valore di tipo di valore in cui si davvero vogliono un riferimento ... un riferimento deve essere quello di un oggetto, in modo che il CLR crea un oggetto per avvolgere il valore tipo di valore, e restituisce un riferimento a tale involucro (il "box" memorizzare il valore).

Altri suggerimenti

Pugilato / unboxing è una caratteristica della lingua e il runtime, non è una caratteristica di ArrayList. In parole povere, è la conversione di un tipo di valore da / per il tipo Object , e dal momento che ArrayList prende in Objects, qualsiasi tipo di valore si passa verranno inscatolati automaticamente con l'istruzione box iL.

In particolare, boxing / unboxing comporta la creazione o esaminando un nuovo oggetto, e copiare i dati del tipo di valore dalla pila al mucchio (o viceversa). E 'piuttosto costoso, e si vorrebbe evitare, se possibile.

Nel caso di tipi di riferimento, nessun codice boxe viene normalmente generata; ogni istruzione unbox che opera su un tipo di riferimento è, inoltre, semplicemente ignorato.

ritengo utile pensare tipi di valore come fuori del sistema tipo di classe, ma considerare ogni tipo di valore come avente un corrispondente tipo di riferimento invisibile derivato da ValueType (che in deriva sua volta da Object) che si comporta sostanzialmente come una classe gli stessi membri come Foo, ma supporta allargando calchi da e per il tipo di valore reale.

Se un tipo di valore viene passato al codice che prevede un derivato di oggetto, sarà fuso al tipo di riferimento invisibile appropriato; se un oggetto di tale tipo di riferimento è assegnato ad una variabile di tipo valore, tornerà getto.

A proposito, se ho avuto i miei druthers, ci sarebbe un modo di specificare che qualcosa di diverso il metodo di default di fusione dovrebbe essere utilizzato, ma non esiste tale funzione.

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