Cu toate acestea, uneori este de dorit să salvați un șir invizibil asociat obiectului, fără a deranja colectorul de gunoi pentru a scoate obiectul din memorie. Când colectorul de gunoi șterge obiectul, șirul nu este asociat cu niciun obiect și putem determina acest lucru. Dacă colectorul de gunoi nu a atins încă obiectul, cu această linie putem restabili o referință puternică la obiect și o putem folosi din nou.
Acest lucru poate fi util în situații diferite, dintre care cele mai tipice sunt enumerate mai jos:
Utilizarea serviciilor externe fără salvarea obiectului. Serviciile cum ar fi cronometrele și evenimentele pot fi furnizate obiectelor fără salvarea referințelor la acestea, ceea ce poate ajuta la eliminarea cauzelor tipice de pierderi de memorie.
Gestionați automat strategia de cache sau mențineți un grup de obiecte. Memoria cache poate stoca referințe slabe la obiectele recent folosite, fără a interfera cu utilizarea lor; Bazinul poate fi împărțit în două părți - cel principal, dimensiunea minimă, care conține legături puternice, iar unul suplimentar conține referințe slabe.
Păstrarea obiectelor mari în speranța că nu vor fi reciclate. O aplicație poate stoca o referință slabă la un obiect mare, care necesită mult timp pentru a crea și inițializa. Dacă obiectul este distrus de colectorul de gunoi, aplicația va fi capabilă să o recreeze; altfel puteți reutiliza.
Rețineți că singura modalitate sigură de a obține o legătură puternică cu un obiect de legătură slab este proprietatea Target. Chiar dacă proprietatea IsAlive revine la adevărat, este posibil ca imediat după aceea obiectul să fie recuperat. Pentru a evita o condiție a cursei, trebuie mai întâi să utilizați proprietatea Target, să atribuiți valoarea de retur unei legături puternice (variabilă locală, câmp și așa mai departe) și apoi să comparați rezultatul cu nul. Proprietatea IsAlive trebuie utilizată numai atunci când este necesar să se determine distrugerea obiectului; de exemplu, pentru a elimina o legătură slabă din memoria cache.
Mai jos este o versiune de proiect a implementării evenimentelor bazate pe link-uri slabe (așa cum se arată în figură). Evenimentul în sine nu poate folosi mecanismul delegat .NET în mod direct, deoarece delegatul păstrează o referință puternică la scopul său și aceasta este o circumstanță jenantă. Cu toate acestea, puteți stoca obiectivul delegatului (sub forma unui link slab). Această abordare vă permite să scăpați de una dintre cele mai frecvente cauze ale scurgerilor de memorie în .NET, când evenimentele de uitare continuă să fie înregistrate!
Generatorul de evenimente stochează referințe slabe la toți abonații. Dacă abonatul nu poate fi găsit pentru aplicație, generatorul de evenimente poate determina acest lucru prin apariția valorii nul în legătură slabă.
Descriptorii colectorilor de gunoi
să păstreze o referință regulată (puternică) la obiect, prevenind eliminarea acestuia; reprezentat de valoarea GCHandleType.Normal;
păstrați o scurtă referință slabă la obiect; reprezentat de valoarea GCHandleType.Weak;
salvați o lungă referință slabă la obiect; este reprezentată de valoarea GCHandleType.WeakTrackResurrection;
În practică, descriptorii de colector GC sunt folosiți rar în mod direct, dar adesea participă la rezultate de profilare, fiind un alt tip de rădăcină care vă permite să dețineți obiecte gestionate.