Se chiamo "Metodo()", cosa succede all'oggetto MyClass creato nel processo?
Viene creato nell'heap GC. Quindi un riferimento alla sua posizione nell'heap viene posizionato nello stack. Quindi avviene la chiamata a AnotherMethod. Quindi viene chiamato il metodo ToString dell'oggetto e il risultato viene stampato. Quindi restituisce AnotherMethod.
Esiste ancora nello stack dopo la chiamata, anche se non lo sta utilizzando?
La tua domanda è ambigua. Con "la chiamata" intendi la chiamata a Method o AnotherMethod? Fa la differenza perché a questo punto, se la memoria dell'heap è un candidato per la garbage collection dipende dalla compilazione o meno delle ottimizzazioni. Ho intenzione di modificare leggermente il tuo programma per illustrare la differenza. Supponiamo che hai avuto:
void Method()
{
AnotherMethod(new MyClass());
Console.WriteLine("Hello world");
}
con le ottimizzazioni al largo, a volte in realtà generare codice che sarebbe come questo:
void Method()
{
var temp = new MyClass();
AnotherMethod(temp);
Console.WriteLine("Hello world");
}
Nella versione non ottimizzata, il tempo di esecuzione sarà effettivamente scegliere di trattare l'oggetto come non- raccoglibile fino al ritorno di Method, dopo WriteLine. Nella versione ottimizzata, il runtime può scegliere di trattare l'oggetto come oggetto da collezione non appena viene restituito AnotherMethod, prima di WriteLine.
La ragione della differenza è perché rendere la vita degli oggetti più prevedibile durante le sessioni di debug spesso aiuta le persone a capire i loro programmi.
Oppure viene rimosso immediatamente?
Nulla viene raccolto immediatamente; il garbage collector funziona quando sembra che dovrebbe funzionare. Se hai bisogno di risorse come l'handle di un file da ripulire immediatamente quando hai finito, usa un blocco "using". In caso contrario, quindi lasciare che il garbage collector decida quando raccogliere la memoria.
Devo impostarlo su null per far sì che GC lo noti più rapidamente?
Devi impostare quale valore su null? Quale variabile avevi in mente?
Indipendentemente dal fatto che non si è fare fare qualsiasi cosa per far funzionare il garbage collector. Funziona da solo bene senza chiedere conferma.
Penso che tu stia pensando troppo a questo problema. Lascia che il garbage collector faccia la sua cosa e non ti preoccupare. Se stai avendo un problema reale con la memoria che non viene raccolta in modo tempestivo, mostraci un codice che illustra questo problema; altrimenti, rilassati e impara ad amare il recupero automatico della memoria.
A differenza di C++, gli oggetti non vivono nello stack in lingue come Java/C#; solo i riferimenti agli oggetti fanno, gli oggetti stessi sono nell'heap. –