V programovacích jazycích může mít objekt během své existence pouze proměnnou, po okamžiku jej nelze změnit. Stejnou paměťovou buňku tedy nelze přiřadit novým hodnotám, a proto je pro správu nevyužitých mezer nutná určitá automatizovaná správa paměti. Tyto nevyužité prostory se nazývají odpadky a celý proces efektivní správy paměti se nazývá sběr odpadu.
Hlavním cílem sběratele odpadu je oddělit mrtvé předměty od živých objektů a získat zpět prostor pro opětovné použití. V podstatě celá věc funguje na spravované haldě, což není nic jiného než blok paměti a sběratel odpadu pravidelně kontroluje paměť haldy, aby přidělila paměť novým objektům. Existují dvě metody uvolnění nespravovaných prostředků, jako jsou soubory a připojení k databázi: Dispose and Finalize.
Tento článek vám pomůže pochopit rozdíl mezi nimi.
Dispose je standardní způsob, jak uživatelé sdělují objektům, aby uvolnili své prostředky, a aby se k nim znovu nepokoušeli. Metoda likvidace poskytuje kontrolu nad explicitním čištěním paměti tím, že objekty není použitelné.
Když uživatelé volají metodu Dispose (), má objekt uvolnit všechny své drahé zdroje a tím jej zpřístupnit pro opětovné použití. To není nikdy nazýváno sběratelem odpadků, který přichází hrát, pouze pokud je spravovaná paměť omezená. K rozhodnutí, kde a jak implementovat Dispose (), se používá speciální rozhraní s názvem „IDisposable“. Co se však stane, když se metoda likvidace nezavolá?
Pokud se metoda likvidace nezavolá, je v záložním plánu pro vyčištění použita metoda Finalize (). Je vyzván sběratelem odpadu, aby provedl konečné vyčištění prostředků dříve, než uvolní paměť. Koncept včasného vyčištění se zde nepoužije, protože namísto okamžitého alokace paměti je objekt přidán do finalizační fronty, aby byl později zničen. Finalizace je spíš ochranná opatření zavedená v případě chyby programování a likvidace nevyčistí prostředky. V tomto případě je metoda Finalize () volána sběratelem odpadu, aby odstranila nedostupné objekty v libovolné posloupnosti, kterou má ráda..
Metoda Dispose se nazývá k urychlení uvolnění nespravovaných prostředků, jako jsou popisovače databáze, popisovače souborů, semafory a další objekty přidělené operačním systémem. Metoda dispose je vyvolána ke spuštění kódu vyžadovaného k vyčištění nevyužité paměti a vzácných zdrojů, jako jsou úchyty GDI. Zjednodušeně řečeno, metoda dispose poskytuje kontrolu nad explicitním vyčištěním paměti. Na druhou stranu metoda Finalize je součástí sběru odpadu, který se používá k provedení závěrečného čištění objektu před jeho sbíráním. Jednoduše řečeno, metoda finalizace se nazývá k uvolnění nespravovaných prostředků držených objektem dříve, než je zničen.
Metodu likvidace lze explicitně nazvat uživatelským kódem a třídou, která implementuje metodu likvidace zdrojů. Paměť však nelze uvolnit, dokud sběrný program nespustí proces čištění. Metodu lze volat, i když ještě existují jiné odkazy na objekt. Naopak, metoda finalizace může být vyvolána sběratelem odpadu pouze poté, co zjistí, že je zničena poslední instance objektu paměti a neexistují žádné další odkazy na objekt. Po provedení metody finalizace je objekt odebrán z paměti haldy.
Proces likvidace objektu z paměti se nazývá dispose pattern, který může být použit pro objekty, které přistupují k nespravovaným prostředkům, protože sběratel odpadu není schopen získat zpět nespravované prostředky. Je implementováno rozhraní „IDisposable“ spolu s další metodou Dispose (Boolean), která požaduje uvolnění nespravovaných prostředků. Metoda finalizace se provede, když je instance objektu zničena před jeho přidělením. Je to nedeterministická metoda, která se vyskytuje podle uvážení sběratele odpadu a nemusí se dokonce vyskytovat. Nemělo by být implementováno na spravované objekty, dokud to není nezbytně nutné.
Pro okamžitou likvidaci objektů je mnohem rychlejší použít metodu likvidace než dokončit. Destruktory jsou automaticky převedeny na finalizační metodu za běhu. Je automaticky vyvolán sběratelem odpadků, když objekt zmizí z rozsahu, ke kterému obvykle dochází, když je instance tohoto objektu zničena. Problém s finalizační metodou je v tom, že je to nedeterministický význam, není jisté, kdy získat zpět paměť, na kterou již není odkazováno prostřednictvím sběru odpadu. Může však uvolnit paměť okamžitě; ve skutečnosti ji nikdy nelze nazvat a nelze ji explicitně vynutit.
Hlavní rozdíl mezi metodami likvidace a finalizace je v tom, že první je deterministická metoda, která okamžitě likviduje objekty, když se již nepoužívají, zatímco druhá je nedeterministická metoda pro přidělování nespravovaných prostředků, což znamená, že se jedná o metodu backstop, která se uvolní instance paměťových objektů, když zmizí z rozsahu před jejich deallokací. Vždy je vhodné použít metodu likvidace po dokončení, pokud to není nezbytně nutné.
Jinými slovy, finalizace je ochranná opatření zavedená pro vyčištění nespravovaných prostředků, pokud nelze v případě nějaké chyby programování volat metodu likvidace. Metoda finalizace je volána sběratelem odpadků, když je objekt vyhozen z haldy paměti.