Qual è la differenza tra boxing/unboxing e type casting?Qual è la differenza tra boxing/unboxing e type casting?
Spesso i termini sembrano essere usati in modo intercambiabile.
Qual è la differenza tra boxing/unboxing e type casting?Qual è la differenza tra boxing/unboxing e type casting?
Spesso i termini sembrano essere usati in modo intercambiabile.
Il boxing e unboxing è un sottoinsieme di tipi cast. La boxe è l'atto di trattare un tipo di valore come tipo di riferimento (che in pratica implica la copia del contenuto di quel tipo di valore (dallo stack) all'heap e la restituzione di un riferimento a quell'oggetto). Ciò consente di passare un tipo di valore ovunque sia previsto un tipo di riferimento compatibile. Consente inoltre di eseguire chiamate di metodi virtuali e altre funzionalità dei tipi di riferimento sul tipo di valore. Unboxing è il contrario di questa operazione (recuperare un tipo di valore da un oggetto in scatola).
Tipo di cast è il termine utilizzato per qualsiasi tipo di conversione da una variabile di tipo specifico a un altro. È un concetto più ampio.
A pochi minuti I answered a related question that covers this difference. Per riassumere, ho categorizzato diversi tipi di istruzioni IL generati da C operator # Cast:
box
istruzioni IL) e unboxing (unbox
istruzioni IL)dynamic_cast<Type>
in C++, utilizza castclass
istruzioni iL verificare)static_cast<Type>
in C++, ci sono un sacco di istruzioni iL per diversi tipi di calchi tra tipi primitivi)op_XXX
).Questo non mi aiuta molto. Immagino che farò qualche ricerca su internet per trovare definizioni specifiche da confrontare. –
Non direi che boxe/unboxing sono un sottoinsieme di casting. Si tratta di spostare i tipi di valori in tipi di riferimento, in modo che possano essere modificati/archiviati altrove. Dove-come il casting è il processo di ri-interrompere un tipo di riferimento. –
@ Simeon: da una prospettiva di progettazione del linguaggio, un * int inciso * è solo un tipo diverso e si sta convertendo tra diversi tipi. –
Boxing è il termine per trasformare un tipo di valore (int, double, float, Guid, ecc.) In un tipo di riferimento (System.Object, System.String, ecc.). Questa operazione di boxing alloca la memoria sull'heap (che il garbage collector dovrà eventualmente recuperare). Unboxing è il contrario di questo processo, prendendo un tipo di riferimento e trasformandolo in un tipo di valore.
La trasmissione sta prendendo un tipo (ad esempio, System.Object) e lo considera come un altro tipo (ad esempio, System.String).
Quando si inserisce qualcosa in C#, lo si trasmette a un altro tipo. La differenza è che alloca memoria aggiuntiva quando viene creato un nuovo tipo di riferimento.
Bottom line: boxing è un tipo speciale di cast che converte un tipo di valore in un tipo di riferimento, che richiede l'assegnazione di un nuovo tipo di riferimento.
Grazie! Questo è il tipo di risposta che sto cercando! –
Heap è un dettaglio di implementazione. – jason
Questo dettaglio "heap" mi aiuta a capirlo meglio! –
Boxing/unboxing e type casting sono due operazioni diverse, tuttavia utilizzano la stessa sintassi.
Essi vengono utilizzati solo in modo intercambiabile quando la persona parla non sa quello che sta realmente accadendo ...
Boxing sta memorizzando un tipo di valore come un oggetto sul mucchio, e unboxing sta leggendo il valore della oggetto. Puoi solo annullare il box del valore in base al tipo esatto.
Casting è quando si converte un tipo di base ad un altro tipo di base (come da un int
ad un long
), o quando si modifica il tipo di un riferimento (come List<int>
-IEnumerable<int>
).
Io * lo so * quello. Sto chiedendo quali sono le differenze! –
Grazie! Questo è quello che stavo cercando! –
La boxe fa riferimento a una conversione di un tipo di valore non nullable in un tipo di riferimento o alla conversione di un tipo di valore in un'interfaccia che implementa (ad esempio int
in IComparable<int>
). Inoltre, la conversione di un tipo di valore sottostante in un tipo nullable è anche una conversione di boxe. (Attenzione, molti discussioni di questo argomento ignorerà questi ultimi due tipi di conversione.)
Ad esempio,
int i = 5;
object o = i;
converte i
a un'istanza di tipo object
.
Unboxing riferisce ad una conversione esplicita da un'istanza di object
o ValueType
un tipo non-nullable valore, la conversione di un tipo di interfaccia di tipo non nullable valore (ad esempio, a IComparable<int>
int
). Inoltre, la conversione di un tipo nullable nel tipo sottostante è anche una conversione unboxing. (Caveat: più discussione di questo argomento ignorerà questi ultimi due tipi di conversione.)
Ad esempio,
object o = (int)5;
int i = (int)o;
converte il numero intero imballati in o
a un'istanza di tipo int
.
Un cast di tipo è una conversione esplicita di un'espressione in un determinato tipo. Così
(type) expression
converte esplicitamente expression
ad un oggetto di tipo type
.
Grazie. Sembra che non ci sia un linguaggio standard riguardo a queste cose. –
C'è un linguaggio molto standard riguardo a queste cose. Vedi la specifica del linguaggio C#, ECMA # 334. – jason
Per chiarezza, quando Jason dice "la conversione di un tipo di valore sottostante in un tipo __nullable__ è anche una conversione di boxe" ciò che intende con "tipo nullable" è un tipo di riferimento, che può essere impostato su null - quindi il suo uso di il termine "nullable". Quello che NON intende è il tipo 'Nullable
Boxing significa convertire una variabile di tipo valore (ovvero un numero intero) in un tipo di riferimento. Unboxing è il contrario, usando il casting di tipo. Nel mondo .NET, tutto deriva dal tipo "oggetto" in poche parole.
Ad esempio (C# esempio):
int myInt = 0; // original variable (unboxed to begin with)
object boxed = myInt; // box it up
int myIntUnBoxed = (int)boxed; // and unbox it again using type casting
Il take-away da questo è l'unificazione del sistema tipo, consentendo di valore tipi di essere trattati come tipi di riferimento. This article ha un aspetto più approfondito al boxing/unboxing.
La lingua di base non ha sempre consentito che i valori/tipi di riferimento siano trattati allo stesso modo? Questa è una cosa specifica di C#? –
(cioè varianti) –
Si potrebbe dire che l'idea di boxing/unboxing proveniva dal linguaggio Basic (preVB.NET). Non è limitato a C#, poiché gli stessi concetti possono essere applicati a VB.NET oa qualsiasi altro linguaggio destinato al runtime .NET. È passato molto tempo da quando ho codificato il linguaggio di base ... ah i ricordi. – ajawad987
Ho dovuto leggere entrambe le prime 2 risposte qui per avere una buona idea di quale sia la differenza, ma penso di avere una stretta abbastanza solida ora –