.NET Heaps and Stacks Questo è un trattamento completo di come funzionano stack e heap.
C# e molti altri linguaggi OOP heap-utilizzando, in generale, l'uso di riferimento-parlare non gestisce i puntatori per i riferimenti in questo contesto (C# è anche in grado di utilizzare puntatori!) Pointer analogie funzionano per alcuni concetti generali, ma questo concettuale il modello si rompe per domande come questa. Guarda l'eccellente post di Eric Lippert su questo argomento Handles are Not Addresses
Non è appropriato dire che Handle ha le dimensioni di un puntatore. (sebbene possa coincidere a essere lo stesso) Le maniglie sono alias per gli oggetti, non è richiesto che siano un indirizzo formale di un oggetto.
In questo caso il CLR capita di utilizzare indirizzi reali per le maniglie: dal link qui sopra:
... il CLR in realtà fa implementare riferimenti a oggetti gestiti come indirizzi per gli oggetti di proprietà del garbage collector , ma questo è un dettaglio di implementazione .
Quindi sì una maniglia è probabilmente 4 byte su un'architettura a 32 bit, e 8 byte su un'architettura a 64 byte, ma questo non è un "certo", ed è non direttamente a causa di puntatori. Vale la pena notare che in base all'implementazione del compilatore e allo gli intervalli di indirizzi utilizzati alcuni tipi di puntatori possono essere diversi nella dimensione.
Con tutto questo contesto è possibile probabilmente modellarlo con un'analogia del puntatore, ma è importante rendersi conto che i manici non devono essere indirizzi. Il CLR potrebbe scegliere di cambiare questo se lo volesse in futuro e i consumatori del CLR non dovrebbero saperlo meglio.
Una trasmissione finale di questo punto sottile:
Si tratta di un C# Pointer:
int* myVariable;
Si tratta di un C# Maniglia:
object myVariable;
Essi non sono la stessa cosa.
Puoi fare cose come la matematica sui puntatori, che non dovresti fare con Handles. Se il tuo handle è implementato come un puntatore e lo usi come se fosse un puntatore, stai usando male l'Handle in un modo che potrebbe metterti nei guai in seguito.
Si noti che queste domande sono tutti dettagli di implementazione (che sono soggetti a modifiche) e non in realtà su C#, ma piuttosto su .NET CLR. – dlev
Chopperdave, una domanda interessante ma voglio chiederti se stai chiedendo cosa intendevi: un riferimento a un oggetto è in gran parte un puntatore e questo è solo un "numero" a seconda dell'architettura del sistema su cui è in esecuzione il tuo codice. Se stai chiedendo come funzionano le allocazioni di .Net Heap, questa è una bestia completamente diversa. –
Volevo solo aggiungere, nessun insulto inteso qui, non sto cercando di implicare che non sai cosa intendi - Il fatto è che in .Net questa è una domanda ambigua e aiuterà i futuri utenti sullo Stack Overflow per sapere con precisione di quale contesto stiamo parlando. –