V programovacích jazykoch môže mať objekt počas svojej existencie len premennú, po okamihu ho už nie je možné upravovať. Rovnakú pamäťovú bunku nie je možné prideliť novým hodnotám, a preto je na správu nevyužitých priestorov potrebná určitá automatizovaná správa pamäte. Tieto nevyužité priestory sa nazývajú odpadky a celý proces efektívnej správy pamäte sa nazýva zber odpadu.
Hlavným cieľom zberača odpadu je oddeliť mŕtve predmety od živých objektov a získať späť priestor na opätovné použitie. V podstate celá vec funguje na spravovanej halde, čo nie je nič iné ako blok pamäte a zberač odpadu pravidelne kontroluje pamäť haldy, aby pridelila pamäť novým objektom. Existujú dva spôsoby uvoľnenia nespravovaných prostriedkov, ako sú súbory a pripojenia k databázam: Dispose and Finalize.
Tento článok vám pomôže pochopiť rozdiel medzi nimi.
Dispose je štandardný spôsob, ako môžu používatelia povedať, aby objekty uvoľnili svoje prostriedky a aby sa k týmto objektom znova nepristupovali. Metóda likvidácie poskytuje kontrolu nad čistým čistením pamäte tak, že objekty nie sú použiteľné.
Keď používatelia volajú metódu Dispose (), objekt má uvoľniť všetky svoje drahé zdroje a tým ho sprístupniť na opätovné použitie. Nikdy ho nezavolal zberateľ odpadu, ktorý sa začne hrať, len ak bude spravovaná pamäť nedostatočná. Na rozhodovanie, kde a ako implementovať Dispose (), sa používa špeciálne rozhranie s názvom „IDisposable“. Čo sa však stane, keď sa metóda likvidácie nezavolá?
Ak sa metóda likvidácie nezvolá, v núdzovom pláne je na vyčistenie použiť metódu Finalize (). Zberač odpadu sa nazýva, aby vykonal konečné vyčistenie prostriedkov skôr, ako uvoľní pamäť. Pojem včasného vyčistenia sa tu neuplatňuje, pretože namiesto okamžitého pridelenia pamäte sa objekt pridá do finalizačného frontu, aby sa neskôr zničil. Finalizácia je skôr zárukou zavedenou v prípade chyby programovania a likvidácia nevyčistí prostriedky. V takom prípade metóda zberača odpadu volá metódu Finalize (), aby odstránila nedostupné objekty v akejkoľvek sekvencii, ktorá sa jej páči..
Metóda Dispose sa nazýva na urýchlenie uvoľnenia nespravovaných prostriedkov, ako sú popisovače databázy, popisovače súborov, semafory a ďalšie objekty pridelené operačným systémom. Vyvolá sa metóda dispose na vykonanie kódu potrebného na vyčistenie nepoužitej pamäte a obmedzených zdrojov, ako sú rukoväte GDI. Jednoducho povedané, metóda likvidácie poskytuje kontrolu nad explicitným čistením pamäte. Na druhú stranu je metóda Finalize súčasťou zberu odpadu, ktorý sa používa na vykonanie konečného vyčistenia objektu pred jeho zberom. Jednoducho povedané, metóda finalizácie sa nazýva, aby sa uvoľnili nespravované zdroje v držbe objektu pred jeho zničením.
Metódu zlikvidovania možno explicitne nazvať kódom používateľa a triedou, ktorá implementuje metódu zlikvidovania zdrojov. Pamäť však nemôže byť uvoľnená, kým zberač odpadu nevykoná proces vyčistenia. Metódu je možné volať, aj keď ešte existujú ďalšie odkazy na objekt. Naopak, metóda finalize môže byť vyvolaná kolektorom odpadkov až potom, čo sa zistí, že posledná inštancia pamäťového objektu je zničená a už neexistujú žiadne ďalšie odkazy na objekt. Po vykonaní metódy finalizácie sa objekt odstráni z haldy pamäte.
Proces likvidácie objektu z pamäte sa nazýva dispose pattern, ktorý sa môže použiť pre objekty, ktoré pristupujú k nespravovaným zdrojom, pretože zberač odpadu nie je schopný získať späť nespravované prostriedky. Implementuje sa rozhranie „IDisposable“ spolu s ďalšou metódou Dispose (Boolean), ktorá požaduje uvoľnenie nespravovaných prostriedkov. Finalizačná metóda sa vykoná, keď sa inštancia objektu zničí pred jeho pridelením. Je to nedeterministická metóda, ktorá sa vyskytuje podľa uváženia zberača odpadu a nemusí sa dokonca objaviť. Nemalo by sa implementovať na spravované objekty, pokiaľ to nie je nevyhnutné.
Na okamžitú likvidáciu predmetov je oveľa rýchlejšie použiť metódu likvidácie ako finalizovať. Destruktory sa automaticky prevádzajú na konečnú metódu za behu. Zberač odpadu sa automaticky vyvolá, keď objekt zmizne z rozsahu, ktorý sa zvyčajne stáva, keď sa inštancia tohto objektu zničí. Problém s finalizačnou metódou je v tom, že je to nedeterministický význam, nie je isté, kedy získať späť pamäť, na ktorú už nie je odkazované zbieranie odpadu. Nemusí však okamžite uvoľniť pamäť; v skutočnosti ho nikdy nemožno povolať a nemožno ho výslovne vynútiť.
Hlavný rozdiel medzi metódami likvidácie a finalizácie je v tom, že prvý spôsob je deterministická metóda, ktorá okamžite vyradí objekty, keď sa už nepoužívajú, zatiaľ čo druhá metóda je nedeterministická metóda na prideľovanie nespravovaných zdrojov, čo znamená, že sa jedná o backstop spôsob uvoľnenia inštancie pamäťových objektov, keď vypršia z rozsahu pred ich pridelením. Vždy je vhodné používať metódu likvidácie po dokončení, pokiaľ to nie je nevyhnutné.
Inými slovami, finalizácia je záruka zavedená na vyčistenie nespravovaných zdrojov, keď metódu likvidácie nemožno zavolať v prípade nejakej chyby programovania. Metóda Finalize sa nazýva zberač odpadu, keď sa má objekt vyhodiť z pamäte haldy.