Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Principiante: utilizzo di dispose
venerdì 15 giugno 2007 - 11.13
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
bito
Profilo
| Newbie
4
messaggi | Data Invio:
ven 15 giu 2007 - 11:13
Salve
non ho molto chiaro il meccanismo del dispose, su msdn e in vari siti ho trovato tutti esempi in cui viene utilizzato il distruttore.
Supponendo che nella mia classe io abbia dei riferimenti a degli oggetti, impostati da costruttore e condivisi tra piu' oggetti, e che nel dispose voglia solo assicurarmi che il conteggio dei riferimenti a questi oggetti condivisi venga decrementato, impostando il membro a null e/o chiamare metodi specifici di questi oggetti.
E' sempre necessario chiamare gc.Suppressfinalize ? in altre parole: ci pensa gc a decrementare il conteggio dei riferimenti ai membri di una classe?
Cosa succede se non lo chiamo?
E' obbligatorio usare il pattern descritto su msdn: classe base che implementa dispose() , possiede un metodo dispose(bool), classe figlia che deve gestire le risorse sovrascrivendo l'ultimo metodo citato?
Grazie in anticipo
S.
Cteniza
Profilo
| Guru
1.509
messaggi | Data Invio:
ven 15 giu 2007 - 20:16
GC ti consiglierei di chiamarlo proprio quando è indispensabile, tanto comunque la distruzione materiale dell'oggetto la fa comunque quando gli pare, al massimo puoi incasinare il tuo programma.
Meglio strutturare gli oggetti perchè facciano il dispose (implementare IDisposable) ed utilizzare using per creare gli oggetti es:
using (StreamReader sr = new StreamReader("myfile.txt"))
{
....
}
un blocco del genere garantisce la distruzione dello stream correttamente.
munissor
Profilo
| Senior Member
270
messaggi | Data Invio:
ven 15 giu 2007 - 20:57
Attorno all'implementazione di IDIsposable e al Garbage collector ci sono un paio di cose da sapere:
innanzitutto IDisposable va implementato solo quando gestisci risorse unmanaged (es: oggetti com, handle del sistema operativo ecc..) in tutti gli altri casi il funzionamento del GC va più che bene... fa eccezione forse quando devi scollegare degli eventi.
Inoltre il garbage collector NON mantiene un conteggio dei riferimenti, attraverso un algoritmo riesce a determinare se un 'oggetto è raggiungibile o no dal tuo codice, se non è così viene considerato "da eliminare". Nel tuo caso non c'è necessità di utilizzare dispose da quello che ho capito.
Un'implementazione corretta di IDisposable è fatta in questo modo
class MyClass : IDisposable
{
private bool m_IsDisposed = false;
...
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
// Suppress finalize serve a eliminare l'oggetto dalla coda degli oggetti da finalizzare.
// Se chiami dispose è come se chiamassi il distruttore. In questo modo il tuo oggetto
// evita di dover sopravvivere ad una generazione durante l'esecuzione di Finalize...
}
protected override Dispose(bool disposing)
{
if( m_IsDisposed )
return;
if( disposing )
{
// elimina qui risorse gestite
}
// elimina qui risorse non gestite
m_IsDIsposed = true;
}
~MyClass()
{
Dispose(false);
}
}
Questo pattern garantisce che anche le classi derivate funzionino a dovere.
Ci sono due bellissimi articoli di Jeffrey Richter su MSDN a proposito di Garbage collector.. prova a fare una ricerca con google, dovresti trovarli abbastanza facilmente..
Ciao!
munissor
Profilo
| Senior Member
270
messaggi | Data Invio:
mer 20 giu 2007 - 19:58
A mio avviso due ottimio articoli sull'argomento sono i seguenti:
http://msdn.microsoft.com/msdnmag/issues/07/07/CLRInsideOut/default.aspx?loc=it
http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae
Torna su
Stanze Forum
Elenco Threads
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 !