Garbage Collector...

sabato 13 dicembre 2008 - 00.11

tizio90 Profilo | Newbie

Ho letto che programmando in C# non appena nel proprio programma non vi sono più riferimenti a un dato oggetto, esso viene automaticamente deallocato (un po come il Java), senza bisogno di utilizzare costrutti quali il delete del C++. Ma fino a che punto ciò è vero per le classi del .NET? Faccio un esempio: all'interno di una funzione un oggetto Bitmap temporaneo (variabile locale) viene creato a partire da un file. Che succede quando la funzione termina? L'immagine viene realmente automaticamente deallocata dalla memoria o sono necessarie altre operazioni di pulitura per liberare le risorse? E per un'oggetto StreamWriter?

Anonimo Profilo | Senior Member

>Ma fino a che punto ciò è vero per le classi del .NET? Faccio un esempio: all'interno di
>una funzione un oggetto Bitmap temporaneo (variabile locale)
>viene creato a partire da un file. Che succede quando la funzione
>termina? L'immagine viene realmente automaticamente deallocata
>dalla memoria o sono necessarie altre operazioni di pulitura
>per liberare le risorse? E per un'oggetto StreamWriter?

E' vero sempre! Solo che appunto non hai la padronanza complets come l'avevi in linguaggi dove non vi era il gc quali ad esempio c++, dove eri tu a decidere dove e quando una certa area di memoria veniva deallocata. Riguardo al tuo quesito, c'è da dire che il rilascio della memoria avviene in modo non deterministico, ovvero non è possibile sapere a priori l'istante in cui eseguito. Si presume però che alla sua prima passata successivamente al termine della funzione, il gc vedrà che c'è un area di memoria heap che è allocata ma non è referenziata da niente e nessuno, allora la deallocherà.
Puoi formare l'esecuzione del gccome spiegato in questo articolo, tieni conto che però l'esecuzione comporta un certo o/h.

http://www.developer.com/net/csharp/article.php/3343191

Inoltre, se sei così ossessionato, dai un occhio al costrutto using, serve appunto a definire l'ambito all'esterno del quale uno o più oggetti verranno eliminati.

http://msdn.microsoft.com/it-it/library/yh598w02(VS.80).aspx

Ciao!
Riccardo

tizio90 Profilo | Newbie

Più che altro era per sapere se era necessario chiamare comandi di pulitura o tutto veniva fatto in automatico... Ma allora il comando Dispose a cosa serve? Ho letto (non ricordo dove) che serve a deallocare le risorse di un oggetto e andrebbe di norma chiamato quando necessario...

Anonimo Profilo | Senior Member

Il dispose è il metodo nel quale vengo esplicitamente rilasciate delle risorse non gestite (come ad esempio handles di file o risorse, connessioni a database ecc ecc)
Riccardo

tizio90 Profilo | Newbie

Ho capito, quindi il metodo Dispose è quasi sempre facoltativo. Grazie per le risposte
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5