Din categoria “am lucrat vreo 7 ani în .NET și nu am știut că…”
Să zicem că avem o funcție mai lungă și pe la începutul ei avem treabă cu un obiect “mai greu” după care nu mai e nevoie de obiectul respectiv. Eventual mai jos în funcție urmează interogări ale unei baze de date care durează deci avem șansa să prindem o colectare de gunoi și obiectul greu de la început să promoveze în generația unu sau chiar doi de gunoaie.
7 ani în .NET (și departe de Tibet) în astfel de situații am pus obiectul pe Nothing imediat după ce nu l-am mai folosit ca să nu fie ținut referențiat pînă la finalul funcției și eventual pe durata ei să rămînă necolectat și promovat în altă generație deci mai greu de colectat.
Toată construcția din capul meu pornea de la ideea că obiectul “moare” cînd execuția părăsește zona în care el a fost declarat (așa se întîmpla în VB pre .NET și nu mă luați cu povești de genul “păi da, programator de VB…” voi cei care nu ați avut management automat al memorie deloc pînă în 2002 :-p).
După multă vreme am aflat că nu a stricat cu nimic să pun pe Nothing cît mai repede obiectele de care ziceam mai sus dar nici de mare ajutor nu a fost. Se pare că la compilare, codul e analizat static și compilatorul setează pe Nothing automat obiectele IMEDIAT după ultima referire la ele în cod, nu la părăsirea zonei în care a fost declarat – deci compilatorul eliberează automat obiectele cu maximă eficiență (cît de curînd e posibil avînd în vedere codul).
Nu am verificat cu mîna mea în IL să văd dacă așa este dar îi cred pe cuvînt. Partea interesantă e că nici nu poți ști dacă e așa fără analiza codului compilat: orice atingere de obiect ar muta dereferențierea automată mai jos, imediat după. E cam ca lumina din frigider: tocmai curiozitatea de a vedea dacă e aprinsă o aprinde.
Frumos din partea lor că au făcut compilatorul așa de bine dar puteau să îmi spună treaba asta de la început, eventual să mă fi sunat…
Notă: tocmai am aflat că poți să verifici că lumina e stinsă fără să o aprinzi tu însuți deschizînd ușa frigiderului (la debug, cu tooltip-urile care afișează valorile variabilelor). Interesant că nu am băgat nici asta de seamă atîta vreme sau poate nu am fost niciodată tentat să inspectez valorile după ultima linie de cod în care datele ar fi contat.