În limbile de programare, un obiect poate avea variabilă doar pe durata existenței sale, după instanțiere nu poate fi modificat. Deci aceeași celulă de memorie nu poate fi alocată unor valori noi, deci este necesar un fel de gestionare automată a memoriei pentru a gestiona spațiile neutilizate. Aceste spații neutilizate sunt numite gunoi și întregul proces de gestionare eficientă a memoriei se numește colectare de gunoi.
Obiectivul principal al colectorului de gunoi este de a separa obiectele moarte de obiectele vii și de a recupera spațiul pentru reutilizare. Practic, totul funcționează pe un heap administrat, care nu este altceva decât un bloc de memorie, iar colectorul de gunoi verifică periodic memoria heapului pentru a aloca memorie obiectelor noi. Există două metode de a elibera resurse neadministrate, cum ar fi fișierele și conexiunile bazei de date: Dispose and Finalize.
Acest articol vă ajută să înțelegeți diferența dintre cele două.
Aruncarea este un mod obișnuit pentru ca utilizatorii să spună obiectelor să-și elibereze resursele și să nu încerce să acceseze din nou obiectele. Metoda dispose prevede controlul curățării memoriei explicite făcând obiectele inutilizabile.
Când utilizatorii apelează metoda Dispose (), obiectul trebuie să elibereze toate resursele costisitoare, făcând astfel disponibil pentru reutilizare. Nu este niciodată chemat de colectorul de gunoi, care vine doar să se joace când memoria administrată devine puține. O interfață specială numită "IDisposable" este folosită pentru a decide unde și cum să implementeze Dispose (). Dar ce se întâmplă atunci când metoda de eliminare nu este chemată?
Dacă metoda de eliminare nu este apelată, planul de rezervă este de a utiliza metoda Finalize () pentru curățare. Acesta este numit de către colectorul de gunoi pentru a efectua o curățare finală a resurselor înainte de a elibera memoria. Conceptul de curățare în timp devine inaplicabil aici, deoarece, mai degrabă decât de-alocarea de memorie imediat, obiectul este adăugat la coada de finalizare numai pentru a fi distruse mai târziu. Finalize este mai mult o garanție pusă în aplicare în cazul unei erori de programare și dispunerea nu curăță resursele, caz în care metoda Finalize () este apelată de către colectorul de gunoi pentru a elimina obiectele nedorite în orice secvență îi place.
Metoda de eliminare este chemată pentru a accelera eliberarea unor resurse neadministrate, cum ar fi mânerele bazei de date, mânerele fișierelor, semaphorele și alte obiecte alocate de sistemul de operare. Metoda de dispunere este invocată pentru a executa codul necesar pentru a curăța memoria neutilizată și resursele limitate ca mânerele GDI. În termeni simpli, metoda dispose oferă controlul curățării memoriei explicite. Metoda de finalizare, pe de altă parte, face parte din colecția de gunoi folosită pentru a efectua o operațiune finală de curățare a unui obiect înainte de colectarea gunoiului. Pur și simplu, metoda finalizării este chemată să elibereze resursele neadministrate deținute de un obiect înainte ca acesta să fie distrus.
Metoda de eliminare poate fi numită în mod explicit de codul de utilizator și de clasa care implementează metoda de dispunere a resurselor. Cu toate acestea, memoria nu poate fi eliberată până când colectorul de gunoi efectuează procesul de curățare. Metoda poate fi apelată chiar dacă alte referințe la obiect există în continuare. Metoda finalizată, dimpotrivă, poate fi invocată de colectorul de gunoi numai după ce se determină că ultima instanță a obiectului de memorie este distrusă și nu mai există referințe la obiect. După ce metoda de finalizare este executată, obiectul este scos din memoria heap.
Procesul de eliminare a unui obiect din memorie se numește model de dispunere, care poate fi folosit pentru obiectele care accesează resurse neadministrate, deoarece colectorul de gunoi nu poate recupera resursele neadministrate. Interfața "IDisposable", împreună cu o metodă suplimentară Dispose (Boolean), este implementată, cerând eliberarea de resurse neadministrate. O metodă finalizată este executată atunci când instanța unui obiect este distrusă înainte de a se dezafecta. Este o metodă nedeterministică care apare la discreția colectorului de gunoi și poate să nu apară nici măcar. Nu ar trebui să fie implementat pe obiecte gestionate până când este extrem de necesar.
Este mult mai rapid să utilizați o metodă de dispunere decât să finalizați pentru eliminarea instantanee a obiectelor. Destructorii sunt convertiți automat pentru a finaliza metoda la timpul de execuție. Este invocată automat de către colectorul de gunoi atunci când obiectul iese din domeniul de aplicare, care se întâmplă de obicei atunci când instanța acelui obiect este distrusă. Problema cu metoda finalizării este că aceasta este non-determinist, adică nu este sigur când să recuperăm memoria care nu mai este menționată prin colectarea gunoiului. Cu toate acestea, este posibil să nu se elibereze imediat memoria; de fapt, el nu poate fi niciodată chemat și nu poate fi forțat în mod explicit.
Principala diferență între metodele de eliminare și finalizare este aceea că prima este o metodă deterministă care dispune imediat obiecte când nu mai sunt utilizate, în timp ce aceasta din urmă este o metodă nedeterministică pentru alocarea resurselor neangajate, ceea ce înseamnă că este o metodă de blocare a blocării instanțe de obiecte de memorie atunci când acestea ies din domeniul de aplicare înainte de alocarea lor. Este întotdeauna recomandabil să utilizați metoda de eliminare până la finalizare, dacă nu este absolut necesară.
În alte condiții, finalizarea este o măsură de salvgardare pusă în practică pentru a curăța resursele neadministrate atunci când metoda de dispunere nu poate fi apelată în eventualitatea unei erori de programare. Metoda de finalizare este apelată de colectorul de gunoi atunci când un obiect urmează să fie dat afară din memoria heap.