Eliminați obiectele în Visual Basic

click fraud protection

În articol, Codarea noilor instanțe de obiecte, am scris despre diferitele moduri care Nou se pot crea cazuri de obiecte. Problema opusă, aruncarea unui obiect este ceva de care nu va trebui să vă faceți griji în VB.NET foarte des. .NET include o tehnologie numită Colector de gunoi (GC) care, de obicei, are grijă de toate lucrurile din culise în mod silențios și eficient. Dar, ocazional, de obicei când folosiți fluxuri de fișiere, obiecte sql sau obiecte grafice (GDI +) (adică resurse neadministrate), este posibil să fie nevoie să preluați controlul eliminării obiectelor în propriul cod.

În primul rând, unele fundal

La fel ca a constructor (cel Nou cuvânt cheie) creează un nou obiect, A destructor este o metodă care se numește atunci când un obiect este distrus. Dar este o captura. Oamenii care au creat .NET și-au dat seama că este o formulă pentru buguri dacă două bucăți de cod diferite ar putea distruge un obiect. Deci .NET GC este de fapt controlat și este de obicei singurul cod care poate distruge instanța obiectului. GC distruge un obiect atunci când decide și nu înainte. În mod normal, după ce un obiect părăsește domeniul de aplicare, este

instagram viewer
eliberată de limbajul comun runtime (CLR). CG distruge obiecte atunci când CLR are nevoie de mai multă memorie liberă. Prin urmare, linia de bază este că nu puteți prezice când GC va distruge obiectul.

(Welllll... Este adevărat aproape tot timpul. Poti suna GC.Collect și forța a ciclul de colectare a gunoiului, dar autoritățile spun universal că este o rău idee și total inutilă.)

De exemplu, dacă codul dvs. a creat un Client obiect, se poate părea că acest cod îl va distruge din nou.

Client = Nimic

Dar nu. (Setarea unui obiect pe Nimic este denumită în mod obișnuit, dereferencing obiectul.) De fapt, înseamnă doar că variabila nu mai este asociată cu un obiect. La ceva timp mai târziu, GC va observa că obiectul este disponibil pentru distrugere.

Apropo, pentru obiectele gestionate, nimic din toate acestea nu este cu adevărat necesar. Deși un obiect precum un buton va oferi o metodă Eliminați, nu este necesar să o utilizați și puțini oameni o fac. Componentele Windows Forms, de exemplu, sunt adăugate la un obiect de nume numit componente. Când închideți un formular, metoda Eliminați este apelată automat. De obicei, trebuie să vă faceți griji pentru oricare dintre acestea atunci când utilizați obiecte neadministrate, și chiar atunci doar pentru a opta programul.

Modul recomandat de a elibera orice resurse care ar putea fi deținute de un obiect este să apelezi la Dispune metoda pentru obiect (dacă unul este disponibil) și apoi abandonează obiectul.

Client. Dispune() Client = Nimic

Deoarece GC va distruge un obiect orfan, indiferent dacă setați sau nu variabila obiect pe Nimic, nu este chiar necesar.

Un alt mod recomandat de a vă asigura că obiectele sunt distruse atunci când nu mai sunt necesare este de a pune codul care folosește un obiect în Utilizarea bloc. Un bloc de utilizare garantează eliminarea uneia sau mai multor astfel de resurse atunci când codul dvs. este terminat cu acestea.

În seria GDI +, Utilizarea Block este folosit destul de frecvent pentru a gestiona acele obiecte grafice neplăcute. De exemplu ...

Utilizarea myBrush ca LinearGradientBrush _. = New LinearGradientBrush (_. Pe mine. ClientRectangle, _. Culoare. Culoarea albastra. Roșu, _. LinearGradientMode. Orizontală) <... mai mult cod ...> Închei utilizarea

myBrush este eliminat automat atunci când se execută sfârșitul blocului.

Abordarea GC pentru gestionarea memoriei este o schimbare importantă față de modul în care VB6 a făcut-o. Obiectele COM (utilizate de VB6) au fost distruse când un contor intern de referințe a ajuns la zero. Dar era prea ușor să greșești, astfel încât contorul intern să fie oprit. (Deoarece memoria a fost legată și nu este disponibilă altor obiecte atunci când s-a întâmplat acest lucru, aceasta a fost numită "scurgere de memorie".) În schimb, GC verifică pentru a vedea dacă ceva face referire la un obiect și îl distruge atunci când nu mai există referințe. Abordarea GC are o istorie bună în limbi precum Java și este una dintre marile îmbunătățiri ale .NET.

Pe pagina următoare, ne uităm la interfața IDispozabilă... interfața pe care să o utilizați atunci când trebuie să eliminați obiectele neadministrate în propriul cod.

Dacă codificați propriul obiect care utilizează resurse neadministrate, ar trebui să utilizați IDisposable interfață pentru obiect. Microsoft face acest lucru ușor prin includerea unui fragment de cod care creează modelul potrivit pentru dvs.


Faceți clic aici pentru a afișa ilustrația
Faceți clic pe butonul Înapoi din browser pentru a vă întoarce

Codul adăugat arată astfel (VB.NET 2008):

 Clasa ResourceClass. Implementări IDispozabile. 'Pentru a detecta apelurile redundante. Privat dispus ca boolean = fals. 'Idispozabil. Subsistență protejată Suprafață (_). ByVal dispunând ca Boolean) Dacă nu eu.Dispostat Atunci. Dacă dispune Apoi. „Eliberează alte stări (obiecte gestionate). End If. 'Eliberează-ți propria stare (obiecte neadministrate). 'Setați câmpuri mari pe null. End If. Me.disposed = True. Sub final. #Region "Support IDisposable" 'Acest cod adăugat de Visual Basic în. 'implementează corect modelul de unică folosință. Public Subpunere () Impuneri IDispozabile. Dispune. „Nu schimbați acest cod. 'Puneți codul de curățare. „Eliminați (eliminând ByVal ca Boolean) mai sus. Eliminați (True) GC.SuppressFinalize (Me) End Sub. Subprotejare protejată Sub finalizare () 'Nu schimbați acest cod. 'Puneți codul de curățare. „Eliminați (eliminând ByVal ca Boolean) mai sus. Eliminați (fals) MyBase. Finalizează () Încheiere Sub. #Endregiunea. Clasa finală 

Dispune este aproape un model de proiectare pentru „dezvoltator” în .NET. Există într-adevăr un singur mod corect de a face și acesta este. S-ar putea să credeți că acest cod face ceva magic. Nu este.

Mai întâi rețineți că pavilionul intern dispuse pur și simplu scurtcircuite întreaga chestie, astfel încât să puteți apela Eliminați (aruncați) de câte ori vrei.

Codul ...

 GC.SuppressFinalize (Me) 

... face ca codul dvs. să fie mai eficient spunându-i GC că obiectul a fost deja eliminat (o operație „scumpă” în ceea ce privește ciclurile de execuție). Finalizarea este protejată deoarece GC o numește automat când un obiect este distrus. Nu ar trebui să apelați niciodată Finalizare. Booleanul dispunere indică codul dacă codul dvs. a inițiat eliminarea obiectului (True) sau dacă GC a făcut-o (ca parte a finalize Sub. Rețineți că singurul cod care folosește Booleanul dispunere este:

 Dacă dispune Apoi. „Eliberează alte stări (obiecte gestionate). End If 

Atunci când dispuiți de un obiect, toate resursele sale trebuie eliminate. Când CLR colector de gunoi elimină un obiect numai resursele neadministrate trebuie eliminate, deoarece colectorul de gunoi are grijă automat de resursele gestionate.

Ideea din spatele acestui fragment de cod este că adăugați cod pentru a avea grijă de obiectele gestionate și neadministrate din locațiile indicate.

Când derivați o clasă de la a clasa de bază care implementează IDispozabil, nu trebuie să treceți peste oricare dintre metodele de bază decât dacă utilizați alte resurse care trebuie, de asemenea, eliminate. Dacă se întâmplă acest lucru, clasa derivată ar trebui să înlocuiască metoda Eliminare (eliminare) a clasei de bază pentru a dispune de resursele clasei derivate. Însă nu uitați să apelați metoda Eliminați (eliminarea) clasei de bază.

Suprasolicitări protejate Subjoliți (eliminarea ByVal ca booleană) Dacă nu eu. Dacă dispune Apoi. 'Adăugați codul dvs. la resursele gestionate gratuit. End If. 'Adăugați codul dvs. pentru a elibera resurse neadministrate. End If. MyBase. Eliminați (aruncați) Sub final

Subiectul poate fi ușor copleșitor. Scopul explicației de aici este „demitificarea” a ceea ce se întâmplă de fapt, deoarece majoritatea informațiilor pe care le găsiți nu vă spun!

instagram story viewer