penso che sei classi confuse con dove la memoria vive con come la memoria si tiene a. Quando crei un'istanza di una classe normale, la memoria di quell'istanza risiede nell'heap. A il riferimento a questa istanza potrebbe trovarsi in un oggetto sull'heap (se si imposta una variabile membro all'interno di un'istanza diversa di un oggetto); o una variabile stack (se hai dichiarato una variabile per l'oggetto all'interno di un metodo o l'hai passata a una chiamata di funzione), o potrebbe essere nell'elenco di root globali (se si tratta di un riferimento statico, ad esempio un riferimento Singleton).
Una classe statica non può essere istanziata. Non esiste alcun "riferimento" alla classe in nessun luogo (eccetto per le informazioni sul tipo). I suoi metodi sono solo funzioni caricate in memoria quando il CLR carica l'assembly. È possibile creare un delegato che punti a uno di questi metodi, ma che non fa riferimento a un'istanza della classe. Questo è solo un puntatore a una funzione.
Per esempio, un'occhiata a questo codice:
class ObjectWrapper
{
Object obj = new Object();
}
static void Main(string[] args)
{
ObjectWrapper wrapper = new ObjectWrapper();
...
}
Il metodo principale crea un'istanza di una classe ObjectWrapper. Questa istanza vive nell'heap.
Dentro l'istanza ObjectWrapper, c'è un'istanza della classe Object che vive sul mucchio. Il riferimento a questa classe è all'interno dell'istanza, quindi penso che potresti pensare al riferimento come "vivere nell'heap".
Ora, confronta al seguente codice:
class Singleton
{
static readonly instance = new Singleton();
}
L'istanza dell'oggetto Singleton vive sul mucchio, anche. Tuttavia, il riferimento è un riferimento statico. È gestito dal CLR in un elenco di riferimenti globali o "root".
Ora un'occhiata a questa classe statica:
class ObjectWrapper
{
Object obj = new Object();
}
static class HelperMethods
{
static int DoSomethingUseful(ObjectWrapper wrapper1)
{
ObjectWraper wrapper2 = wrapper1;
// code here
}
}
HelperMethods è una classe statica. Non è possibile creare un'istanza della classe HelperMethods. Non ci possono essere oggetti da questa classe sull'heap. Tuttavia, nel metodo DoSomethingUseful, ha due riferimenti a un'istanza della classe ObjectWrapper in pila. Uno viene passato e uno viene dichiarato all'interno del metodo.
Non capisco nessuna parte di questa domanda. Cosa intendi con "il suo valore" e "il suo riferimento"? –
Mi aspetto che parli di come separa il codice eseguibile dai membri dei dati. –
Tra le altre questioni, è "la sua". – jason