Kurzusok
/
C#
C#
/
Tanterv
/
Erőforrás-felszabadítás
Er

Erőforrás-felszabadítás ebben a kurzusban: C#

2 feladat

A(z) Erőforrás-felszabadítás fogalomról

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:

  • Jelzi a megvalósító osztály használóinak, hogy ők felelősek azért, hogy tudassák az osztállyal (a 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).
  • A fordítóval és a futtatókörnyezettel együttműködve az 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 Dispose-minta

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.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Erőforrás-felszabadítás fogalmat

A gyakorlás zárolva

Oldj fel még 1 feladatot, hogy gyakorolhasd a(z) Erőforrás-felszabadítás fogalmat