Az IDisposable interfész központi szerepet játszik az erőforrások felszabadításában, és C#-ban két fontos feladata van:
Dispose() metódus meghívásával), hogy már nincs rá szükség, így az fel tudja szabadítani a nem felügyelt erőforrásait, vagy vissza tudja állítani a belső állapotát, ahogy épp megfelelő. Ez éles ellentétben áll a takarítás szokásos megközelítésével, ahol hagyjuk, hogy a garbage collector takarítson el mindent (elsősorban a memóriát szabadítsa fel).IDisposable interfész támogatja a using utasítás használatát, amelyet a resource-lifetime feladatban tárgyalunk.Lehetséges, bár nem valószínű, hogy a Dispose()-t valamiféle általános takarítási rutinból hívják meg az interfészen keresztül.
Az IDisposable interfésszel leggyakrabban olyan könyvtári osztályoknál találkozunk, amelyek operációs rendszerbeli (nem felügyelt) erőforrásokat csomagolnak be, például a System.IO.Stream és a System.IO.TextReader. (A Streamekről és a TextReaderekről más feladatokban lesz szó.)
public class TextHandler : IDispoable
{
private TextReader reader = new TextReader(...);
public void Dispose()
{
reader.Dispose();
}
}
Ha egy általad használt osztály megvalósítja az IDispoable interfészt, akkor gondoskodnod kell róla, hogy a Dispose() meghívásra kerüljön (a catch és finally záradékok használatával), amikor a példányra már nincs szükség. Ha egy osztálynak van olyan tagja, amely megvalósítja az IDisposable interfészt, akkor könnyen lehet, hogy magának az osztálynak is meg kell valósítania az IDisposable interfészt, hogy a Dispose() meghívásával fel lehessen szabadítani az IDisposble-t megvalósító tagot.
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();
}
}
Az IDisposable interfész akkor is hasznos lehet, ha egyáltalán nincsenek nem felügyelt erőforrások a képben. Tegyük fel, hogy van egy hosszú életű objektumod, amely elvárja, hogy a rövid életű objektumok regisztrálják magukat nála, majd töröljék a regisztrációjukat, amikor már nincs rájuk szükség. Ha a rövid életű objektumon megvalósítod az IDisposable interfészt, az figyelmezteti az osztályt használó fejlesztőt, hogy a Dispose()-t meg kell hívni a rövid életű objektum élete végén.
A dokumentációban hivatkozásokat fogsz látni a Dispose-mintára. A Dispose-minta része, hogy egy osztály véglegesítőjéből meghívjuk a Dispose()-t, és hogy gondoskodjunk az alaposztályokban lévő erőforrások helyes felszabadításáról. A Dispose-mintát egy későbbi feladatban tárgyaljuk.
A Dispose-minta többnyire a nem felügyelt erőforrásokhoz kapcsolódik. Ha a P/Inovke mechanizmust és extern metódusokat használsz, akkor meg kell értened, hogyan és mikor kell megvalósítani a Dispose-mintát. A legtöbb C#-fejlesztőnek ritkán kell ilyen módon közvetlenül nem felügyelt erőforrásokkal foglalkoznia.