Slabé odkazy

Systém uvolňování paměti nemůže odstranit objekt, který aplikace používá, pokud má kód aplikace k tomuto objektu přístup. Říká se, že aplikace má silné odkazy na objekt.

Slabý odkaz umožňuje systému uvolňování paměti shromáždit objekt, zatímco stále umožňuje aplikaci přístup k objektu. Slabý odkaz je platný pouze během neurčité doby, dokud se objekt neshromáždí, pokud neexistují žádné silné odkazy. Při použití slabého odkazu může aplikace stále získat silný odkaz na objekt, který brání jeho shromažďování. Existuje však vždy riziko, že se systém uvolňování paměti nejprve dostane k objektu před opětovným obnovením silného odkazu.

Slabé odkazy jsou užitečné pro objekty, které používají hodně paměti, ale pokud jsou zrušeny procesem garbage collection, je je možné snadno znovu vytvořit.

Předpokládejme, že stromové zobrazení v aplikaci Windows Forms zobrazuje uživateli složitou hierarchickou volbu možností. Pokud jsou podkladová data velká, udržování stromu v paměti je neefektivní, když je uživatel zapojen do něčeho jiného v aplikaci.

Když uživatel přepne jinou část aplikace, můžete pomocí WeakReference třídy vytvořit slabý odkaz na strom a zničit všechny silné odkazy. Když uživatel přepne zpět na strom, aplikace se pokusí získat silný odkaz na strom a pokud uspěje, vyhne se rekonstrukci stromu.

Chcete-li vytvořit slabý odkaz s objektem, vytvoříte WeakReference pomocí instance objektu, který se má sledovat. Příklad kódu najdete WeakReference v knihovně tříd.

Krátké a dlouhé slabé odkazy

Můžete vytvořit krátký slabý odkaz nebo dlouhý slabý odkaz:

  • Krátké

    Cílem krátkého slabého odkazu se stane null , když je objekt uvolněn uvolňováním paměti. Slabý odkaz je sám o sobě spravovaný objekt a podléhá uvolňování paměti stejně jako jakýkoli jiný spravovaný objekt. Konstruktor bez parametrů pro krátký slabý odkaz je WeakReference.

  • Dlouhý

    Dlouhý slabý odkaz je zachován po zavolání metody objektu Finalize . To umožňuje opětovné vytvoření objektu, ale stav objektu zůstává nepředvídatelný. Chcete-li použít dlouhý odkaz, zadejte true v konstruktoru WeakReference .

    Pokud typ objektu nemá metodu Finalize , použije se krátká slabá referenční funkce a slabý odkaz je platný pouze do doby, než se cíl shromažďuje, což může nastat kdykoli po spuštění finalizátoru.

Chcete-li vytvořit pevný odkaz a znovu použít objekt, přetypujte vlastnost Target objektu WeakReference na typ objektu. Pokud se Target vlastnost vrátí null, objekt byl sesbírán; jinak můžete objekt nadále používat, protože aplikace opět získala silný odkaz na něj.

Pokyny pro používání slabých odkazů

Po dokončení používejte dlouhé slabé odkazy pouze v případě, že je stav objektu nepředvídatelný.

Nepoužívejte slabé odkazy na malé objekty, protože samotný ukazatel může být velký nebo větší.

Nepoužívejte slabé odkazy jako automatické řešení problémů se správou paměti. Místo toho vytvořte efektivní zásady ukládání do mezipaměti pro zpracování objektů vaší aplikace.

Viz také