Ravenflot
02-01-2009, 15:40
Buon anno a tutti !
Ho una domanda specifica sul Garbage Collector. Premetto che io mi riferisco al suo uso in C# (anche nel 3.0 ma immagino valga anche per il 2.0).
Sto leggendo un libro di questo linguaggio e sono arrivato alla trattazione di questo strumento.
So già che non si sa quando questo sia effettivamente chiamato etc etc. So anche che puoi implementare un distrutto ~NomeClasse che verrà chiamato dal GC automaticamente (infatti da codice normale non può essere chiamato) per farti rilasciare le risorse non gestite dal GC (cioè tutto ciò che è una risorsa che può essere utilizzata tramite un handle e comunque qualunque cosa che non sia un blocco di memoria nello heap). Ho anche letto che si può ricorrere all'interfaccia IDisposable per implementare un metodo pubblico Dispose() per chiamare la distruzione dell'oggetto da fuori [e la mia domanda si inserisce in questo punto] , metodo questo che , nella maggior parte degli esempi richiama un metodo con lo stesso nome ma con un flag booleano: è in questo metodo che avviene il rilascio delle risorse: il flag booleano lo si usa per capire da dove è stato chiamato: se dal codice (e allora si rilasciano le risorse managed oltre a quelle unmanaged) o dal distruttore (in questo caso si rilasciano solo le risorse unmanaged perchè alle managed ci penserà il GC essendo il distruttore invocato durante la pulizia del .NET framework.
La mia domanda riguarda la finalizzazione ed il metodo Finalize(). So che è un metodo che non può essere chiamato esplicitamente e lo richiama solo il GC quando è in esecuzione e questo metodo viene eseguito per ultimo, appena dopo il Dispose e quindi il distruttore e si occupa di liberare la memoria heap dalla variabile oggetto relativa. Questo è corretto ? Mi sembra di aver capito che sia l'ultima fase di pulizia, quella del richiamo della memoria nello heap (tralasciando il discorso della coda freachable che mi interessa fino ad un certo punto).
Le mie domande sono 2:
1) il metodo Finalize può essere alterato dal developer ? A me sembra di no: quello che può fare il developer è solo scritto nel Dispose o distruttore...
2) Come è possibile che Finalize sia richiamato all'interno di uno stesso oggetto ? Se fa parte di un oggetto allora come ultima cosa cancella se stesso ? Il mio quesito è proprio questo: il Finalize() mi dà l'idea di un metodo legato a qualcosa e finché è legato a qualcosa, questa cosa deve esistere
Ho una domanda specifica sul Garbage Collector. Premetto che io mi riferisco al suo uso in C# (anche nel 3.0 ma immagino valga anche per il 2.0).
Sto leggendo un libro di questo linguaggio e sono arrivato alla trattazione di questo strumento.
So già che non si sa quando questo sia effettivamente chiamato etc etc. So anche che puoi implementare un distrutto ~NomeClasse che verrà chiamato dal GC automaticamente (infatti da codice normale non può essere chiamato) per farti rilasciare le risorse non gestite dal GC (cioè tutto ciò che è una risorsa che può essere utilizzata tramite un handle e comunque qualunque cosa che non sia un blocco di memoria nello heap). Ho anche letto che si può ricorrere all'interfaccia IDisposable per implementare un metodo pubblico Dispose() per chiamare la distruzione dell'oggetto da fuori [e la mia domanda si inserisce in questo punto] , metodo questo che , nella maggior parte degli esempi richiama un metodo con lo stesso nome ma con un flag booleano: è in questo metodo che avviene il rilascio delle risorse: il flag booleano lo si usa per capire da dove è stato chiamato: se dal codice (e allora si rilasciano le risorse managed oltre a quelle unmanaged) o dal distruttore (in questo caso si rilasciano solo le risorse unmanaged perchè alle managed ci penserà il GC essendo il distruttore invocato durante la pulizia del .NET framework.
La mia domanda riguarda la finalizzazione ed il metodo Finalize(). So che è un metodo che non può essere chiamato esplicitamente e lo richiama solo il GC quando è in esecuzione e questo metodo viene eseguito per ultimo, appena dopo il Dispose e quindi il distruttore e si occupa di liberare la memoria heap dalla variabile oggetto relativa. Questo è corretto ? Mi sembra di aver capito che sia l'ultima fase di pulizia, quella del richiamo della memoria nello heap (tralasciando il discorso della coda freachable che mi interessa fino ad un certo punto).
Le mie domande sono 2:
1) il metodo Finalize può essere alterato dal developer ? A me sembra di no: quello che può fare il developer è solo scritto nel Dispose o distruttore...
2) Come è possibile che Finalize sia richiamato all'interno di uno stesso oggetto ? Se fa parte di un oggetto allora come ultima cosa cancella se stesso ? Il mio quesito è proprio questo: il Finalize() mi dà l'idea di un metodo legato a qualcosa e finché è legato a qualcosa, questa cosa deve esistere