Din ciclul “chestiunea zilei”, Finalize si Dispose, in c#.
Ambele metode sunt executate cand un obiect este distrus. In mod normal Garbage Collector (zis in continuare GC) elibereaza memoria curatand obiectele aflate acolo sprea care nu exista nici o referinta. Cu alte cuvinte, daca avem asa:
Person p = new Person("gigel"); p = null;
vine GC si curata ceea ce am instantiat in p, fara a necesita ca eu, programator, sa ma preocup de curatenie. Frumos, nu? As vrea si in bucatarie sa existe un GC care sa faca curatenie dupa ce eu gatesc. Asa as gati mai des si mai cu chef! Oricum, pana ce o sa am versiunea aia de bucatarie echipata cu GC sa ma inteorc la .Net.
Ce e cu Dispose? Exista o interfata, IDisposable, care contine o metoda Dispose(); Cine implementeaza aceasta interfata in clasa lui, si-a cumparat un loc la procesul de deratizare. In momentul in care un obiect este curatat din memorie, GC executa, daca poate, Dispose(). Aceasta metoda poate fi executata si de user.
Ce e cu Finalize? Aceasta este versiunea de destructor in .Net. Cum se scrie aceasta? Simplu:
public class Person { public Person() { /* constructor code goes here */ } ~Person() { /* destructor */ } }
ceea ce compilerul traduce in:
protected override void Finalize()
{
try
{
// do work here
}
finally
{
base.Finalize();
}
}
Atat in Finalize cat si in Dispose, in mod normal, ar trebui eliberate resursele unmanaged folosite de obiect. Diferenta dintre cele doua este, simplu spus, ca Dispose poate fi executat de user (este ok sa scrii instance.Dispose(), insa Finalise este executat numai de GC. Nu este legal sa fie executat la “dorinta” programatorului.
…uitasem sa spun: GC vine cand vrea el, in .Net nu este controlabil momentul in care GC va face munca de curatenie. E la fel ca programatorul care vine la munca intre 8 si 12, in functie de cat de mult a “fumat” cu o zi inainte.