Supponiamo che ci siano due classi che allocano risorse, la prima ha bisogno di implementare un distruttore ed il metodo Dispose, mentre la seconda no. La differenza sta che la prima classe alloca delle risorse nel costruttore e non le cancella immediatamente. Diversamente, la seconda alloca risorse in una funzione membro e si prende cura di liberarle prima di uscire (utilizzando un blocco di codice finally), così che l’autore della seconda classe non ha la necessità di implementare il metodo Dispose e nemmeno il distruttore.
Segue uno schema ipotetico della classe che deve implementare Dispose.
class MustDispose
{
public MustDispose()
{
// Create a 3rd party object
// Open a file handle
// Allocate some memory
// Open a database connection
// Open a network port
}
~MustDispose()
{
// Customized destructor for this class
// if (3rd party object != null) free the 3rd party object
// if (file handle != null) close the file handle
// if (memory != null) free the memory
// if (connection != null) close the database connection
// if (port open) close the network port
}
public void Dispose()
{
// because this class needs a destructor, it also needs this
// idiomatic Dispose method
Finalize();
System.GC.SuppressFinalize(this);
}
}
Segue uno schema ipotetico della classe che non deve implementare Dispose.
class NoDispose
{
public NoDispose()
{
// this class has an uninteresting constructor so it doesn't need
// a destructor or Dispose
}
public void MemberFuncThatCleansUp()
{
try
{
// create a 3rd party object
// open a file handle
// allocate some memory
// open a database connection
// open a network port
}
finally
{
// if (3rd party object != null) free the 3rd party object
// if (file handle != null) close the file handle
// if (memory != null) free the memory
// if (connection != null) close the database connection
// if (port open) close the network port
}
}
}
Se una classe necessita di un distruttore è necessario scriverne uno personalizzato. In ogni caso, il metodo Dispose proviene da un idioma di C# per una classe che necessita di un distruttore:
public void Dispose()
{
Finalize();
System.GC.SuppressFinalize(this);
}
Quando chiamare il metodo Dispose
Chiamare il metodo Dispose su un oggetto creato se l’autore ha provvisto l’oggetto del metodo Dispose. Chiamare Dispose anche quando si fa uso dell’oggetto, specialmente se l’oggetto rimane nello scope durante una lunga operazione o se l’oggetto alloca molte risorse per il proprio utilizzo.
Infine, segue un tip di C# che chiama Dispose:
MustDispose obj = new MustDispose;
try
{
// use the object
}
finally
{
if (obj != null)
((IDisposable)obj).Dispose();
}