Zlikvidujte a dokončete

Anonim

V programovacích jazycích může mít objekt během jeho existence pouze proměnnou, po instanci nemůže být změněn. Takže stejná paměťová buňka nemůže být přidělena novým hodnotám, takže pro správu nevyužitých prostorů je nutný určitý druh automatizované správy 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ěrače odpadků je oddělit mrtvé předměty od živých objektů a získat prostor pro opětovné použití. V podstatě funguje celá věc na řízené haldě, což není nic jiného než paměťový blok a sběrač odpadků pravidelně kontroluje paměť haldy k přidělení paměti novým objektům. Existují dva způsoby, jak uvolnit nespravované prostředky, jako jsou soubory a databázová připojení: Dispose and Finalize.

Tento článek vám pomůže pochopit rozdíl mezi těmito dvěma.

Co je způsob likvidace?

Zlikvidovat je standardním způsobem, jakým uživatelé mohou říct objekty, aby uvolnili své zdroje a znovu se pokusili o přístup k objektům. Metoda dispose poskytuje kontrolu vyčištění explicitní paměti tím, že objekty jsou nepoužitelné.

Když uživatel zavolá metodu Dispose (), má objekt uvolnit všechny drahé zdroje a tím je zpřístupnit. To není nikdy voláno sběrem odpadků, který jen přijde hrát, když řízená paměť se stane vzácnou. Speciální rozhraní s názvem "IDisposable" slouží k určení, kde a jak implementovat Dispose (). Ale co se stane, když se metoda likvidace nezavolá?

Co je metoda Finalize?

Pokud se metoda dispose nezíská, rezervní plán je použít metodu Finalize () pro vyčištění. Je nazýván sběratelem odpadků, aby provedl konečné vyčištění prostředků, než uvolní paměť. Koncept včasného vyčištění se zde stává nepoužitelným, protože spíše než okamžitě uvolnit paměť, je objekt přidán do finalizačního frontu, jen aby byl později zničen. Dokončení je spíše jako ochranná opatření zavedená v případě chyby programování a likvidace nevyčistí zdroje. V takovém případě je metoda Finalize () nazývána sběrem odpadků, aby se odstranily nedosažitelné objekty v libovolné sekvenci, která se jim líbí.

Rozdíl mezi Dispose a Finalize

Základy likvidace a dokončení

Chcete-li urychlit uvolňování nespravovaných prostředků, jako jsou úchytky databáze, popisovače souborů, semafory a další objekty přidělené operačním systémem, povolíte metodu likvidace. Metoda Displace je vyvolána k provedení kódu potřebného k vyčištění nepoužívané paměti a vzácných zdrojů jako jsou GDI úchyty. Jednoduše řečeno, metoda likvidace poskytuje kontrolu vyčištění explicitní paměti. Metoda finalizace je na druhé straně součástí sběru odpadků, která se používá k provedení závěrečné operace čištění na předmětu před tím, než se sbírá odpadky. Jednoduše řečeno, finalizovat metodu je volána k uvolnění nespravovaných zdrojů držených objektu před tím, než je zničen.

Vyvolání vyřazení a dokončení

Metoda likvidace lze explicitně nazvat uživatelským kódem a třídou, která implementuje metodu na likvidaci zdrojů. Paměť však nemůže být uvolněna, dokud odpadový proces nevykoná vyčištění. Metoda lze volat i v případě, že existují další odkazy na objekt. Finalizační metoda naopak může být vyvolána sběrem odpadků pouze poté, co zjistí, že poslední objekt paměťového objektu je zničen a žádné další odkazy na objekt neexistují. Po dokončení metody dokončení je objekt odebrán z paměti haldy.

Implementace Dispose a Finalize

Proces likvidace objektu z paměti se nazývá likvidační vzorec, který může být použit pro objekty, které přistupují k nespravovaným zdrojům, protože sběrač odpadků není schopen obnovit nespravované prostředky. Rozhraní "IDisposable" spolu s další metodou Dispose (Boolean) je implementováno s požadavkem na uvolnění nespravovaných prostředků. Metoda finalizace se provede, když je instanci objektu zničen před jeho zrušením. Jedná se o nedeterministickou metodu, která se objevuje podle uvážení sběru odpadků a nemusí se dokonce vyskytnout. Nemělo by se provádět na řízených objektech, dokud nebude nezbytně nutné.

Výkon likvidace a dokončení

Je mnohem rychlejší použití metody likvidace, než dokončení pro okamžitou likvidaci objektů. Destruktory jsou automaticky převedeny na finalizaci metody při běhu. Automaticky je vyvolává sběrač odpadků, když objekt vypadne mimo rozsah, což se obvykle děje při zničení instance daného objektu. Problém s finalizovanou metodou spočívá v tom, že jde o nedeterministický význam, že není jisté, kdy má být obnovena paměť, na kterou již není odkazováno prostřednictvím sběru odpadků. Nemusí však okamžitě uvolnit paměť; ve skutečnosti se může nikdy volat a nemůže být výslovně vynuceno.

Dispose vs. Finalize: Srovnávací graf

Shrnutí Dispose vs. Finalize

Hlavním rozdílem mezi metodami likvidace a finalizace je to, že první je deterministická metoda, která okamžitě disponuje objekty, když již nejsou používána, zatímco druhá je nedeterministická metoda pro přidělování nespravovaných zdrojů, což znamená, že je metoda zpětného zavržení instance paměťových objektů, když dojde před jejich zrušením mimo rozsah.Vždy je vhodné použít metodu likvidace před dokončením, pokud to není nutné.

Jinými slovy, dokončení je ochranná opatření zavedená k vyčištění nespravovaných zdrojů, pokud nelze metodu likvidace zavolat v případě nějaké chyby programování. Metoda Finalize je nazývána sběrem odpadků, když se objekt chystá vykopnout z paměti haldy.