2011-03-21 16 views
9

In che modo è possibile assegnare un numero intero a un oggetto in .NET?Come viene assegnato un "int" a un oggetto?

I tipi di riferimento sono derivati ​​da System.Object e i tipi di valore provengono da System.ValueType.

Quindi, come è possibile?

risposta

5

Sei boxing il numero intero in un oggetto.

Cioè, viene creato un oggetto che avvolge (o caselle) il numero intero. Un po 'come mettere qualcosa in una scatola nella vita reale.

+0

La boxe è un fenomeno fisico. In che modo ciò accade (il numero intero non appartiene a System.Object)? – SeeSharp

+0

La citazione di dtb dalla stessa documentazione lo riassume bene. – BoltClock

1

int NET ha un oggetto di tipo integer sottostante e una conversione implicita.

+5

Penso che tu stia confondendo .NET con Java. E non c'è alcuna conversione implicita in corso; è ancora un int, camuffato da oggetto. – BoltClock

+0

Oh sì, l'ho fatto. Questo è quello che ottengo per non aver il tempo di pensare prima di postare. –

+0

@BoltClock In realtà, a causa di circostanze strane, pwny ha una sorta di diritto. Il tipo 'int' (e gli altri tipi numerici) in .net è un tipo" magico ": un valore' int', solo, è solo 4 byte, il che significa che non può avere RTTI. Solo quando si tenta di utilizzarlo come oggetto (ad esempio quando inserito in una scatola) viene inserito all'interno di un'istanza 'System.Integer', che è solo un wrapper. Se si guarda la classe 'System.Integer' tramite Reflector, vedrai che il suo unico membro è' int m_value'. Quindi c'è una conversione implicita in corso, l'unica cosa è che accade ad un livello più basso di quello che ci si potrebbe aspettare. – zneak

7

Boxing and Unboxing:

boxe è il processo di conversione di un tipo di valore all'oggetto tipo o per qualsiasi tipo di interfaccia implementata da questo tipo di valore. Quando il CLR inserisce un tipo di valore, racchiude il valore all'interno di System.Object e lo memorizza nell'heap gestito. Unboxing estrae il tipo di valore dall'oggetto.

3

Si dovrebbe leggere su boxing and unboxing in C# che dovrebbe dirvi che come/perché.

Questo collegamento ha una grande spiegazione e spiega il riferimento vs tipo di valore questione si sta chiedendo di:

http://www.dijksterhuis.org/exploring-boxing/

Boxing sta semplicemente mettendo un tipo di base in wrapper (che lo rende completamente saltato oggetto), e unboxing prende l'oggetto spostato e lo converte in un tipo più semplice. Per eseguire la memoria gestita dal pugile deve essere allocato sull'heap, i riferimenti devono essere aggiornati e il contenuto del tipo di valore deve essere copiato.

4

provare questo metodo:

object ob; 
int i=10; 
ob=i;//(boxing) 
int b; 
b=(int)ob;//(unboxing) 
15

Il termine "boxe" è molto opaco, ma è facile da visualizza ciò che sta effettivamente accadendo usando il debugger. Scrivi una piccola applicazione in modalità console come questa:

using System; 

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      int value = 42; 
      object obj = value; 
     } // <== Breakpoint here 
    } 
} 

Impostare un punto di interruzione dove indicato e premere F5. Quando viene colpito il punto di interruzione, utilizzare Debug + Windows + memoria + memoria 1. Nella casella Indirizzo, digitare "obj". Otterrai un dump esadecimale del contenuto di memoria dell'oggetto. Fai clic destro sulla finestra e seleziona "Intero a 4 byte", il modo migliore per visualizzare l'oggetto in questo caso. Vedrai qualcosa di simile a questo:

0x01CBF6BC 6e1a2d34 0000002a 

le parti interessanti qui sono 0x01CBF6BC, questo è l'indirizzo dell'oggetto sulla garbage collection mucchio. Il prossimo numero esadecimale, 6e1a2d34 è il cosiddetto "handle di tipo", noto anche come "puntatore della tabella dei metodi". Che un "cookie" che identifica il tipo dell'oggetto. System.Int32 in questo caso. Molto importante, verrà utilizzato in un secondo momento quando l'oggetto verrà rimosso da un Int32 per verificare che il valore in scatola sia effettivamente un numero intero.

Il valore successivo che vedi, 0000002a, è il valore dell'oggetto in scatola. È possibile utilizzare la calcolatrice di Windows in modalità programmatore per riconvertire in decimale, è 42.

Provare con questo, utilizzando valori diversi e tipi diversi per vedere come influenza l'oggetto in scatola. È possibile modificare l'esadecimale e vedere quale effetto ha sul valore obj visualizzato dal debugger.

Il dump esadecimale che ti ho dato era per un valore in box di 4 byte, la boxing di un double richiede 8 byte. La boxe di una struct richiederà più byte. C'è anche una parte dell'intestazione dell'oggetto che non puoi vedere, il cosiddetto syncblock, situato all'indirizzo - 4. Prova l'istruzione lock per vedere che cambia.

+4

+1 esercizio eccellente; molto interessante. –

Problemi correlati