L'interfaccia IDisposable è centrale per la pulizia delle risorse e ha due ruoli importanti in C#:
Dispose()) che non è più necessaria, così che possa rilasciare le eventuali risorse non gestite o reimpostare il proprio stato interno come appropriato. Questo si contrappone all'approccio normale alla pulizia, che consiste nel lasciare che il garbage collector ripulisca tutto (principalmente, liberando memoria).IDisposable supporta l'istruzione using di cui si parla nell'esercizio resource-lifetime.È possibile, anche se improbabile, che Dispose() venga chiamato tramite l'interfaccia in una qualche routine di pulizia generica.
IDisposable si incontra più spesso con classi di libreria che incapsulano risorse del sistema operativo (non gestite), come System.IO.Stream e System.IO.TextReader. (Gli Stream e i TextReader sono trattati in altri esercizi).
public class TextHandler : IDispoable
{
private TextReader reader = new TextReader(...);
public void Dispose()
{
reader.Dispose();
}
}
Se una classe che stai usando implementa l'interfaccia IDispoable, devi assicurarti che Dispose() venga chiamato (usando le clausole catch e finally) quando l'istanza non è più necessaria. Se una classe ha un membro che implementa IDisposable, allora potrebbe benissimo dover implementare IDisposable essa stessa, così che Dispose() possa essere chiamato per liberare il membro che implementa IDisposble.
public class Activity : IDisposable
{
private MyResource myResource;
public Activity()
{
myResource = new MyResource();
}
public void Perform()
{
try
{
myResource.BeUseful();
}
catch (Exception)
{
myResource.Dispose();
}
}
public void Dispose()
{
myResource.Dispose();
}
}
L'interfaccia IDisposable può essere utile anche quando non ci sono risorse non gestite in gioco. Supponi di avere un oggetto di lunga durata che richiede che oggetti di breve durata si registrino presso di esso e annullino poi la registrazione quando non sono più necessari. Implementare IDisposable sull'oggetto di breve durata mette sull'avviso lo sviluppatore che usa quella classe che Dispose() deve essere chiamato alla fine della vita dell'oggetto di breve durata.
Nella documentazione troverai riferimenti allo schema di dispose. Lo schema di dispose prevede di chiamare Dispose() dal finalizzatore di una classe e di assicurarsi che la liberazione delle risorse nelle classi base sia gestita correttamente. Lo schema di dispose è trattato in un esercizio successivo.
Lo schema di dispose riguarda per lo più le risorse non gestite. Se usi il meccanismo P/Invoke e i metodi extern, allora devi capire come e quando implementare lo schema di dispose. La maggior parte degli sviluppatori C# raramente ha a che fare direttamente con risorse non gestite in questo modo.