U članku Kodiranje novih instanci objekata pisao sam o različitim načinima na koje Novi mogu se stvoriti primjerci objekata. Suprotan problem, zbrinjavanje predmeta, je nešto zbog čega nećete morati brinuti u VB.NET-u vrlo često. .NET uključuje tehnologiju zvanu Sakupljač smeća (GC) koji se obično tiho i učinkovito brine o svemu iza kulisa. No povremeno, obično kad se koriste protoci datoteka, sql objekti ili grafički (GDI +) objekti (tj. neupravljani resursi), možda ćete trebati preuzeti kontrolu nad uklanjanjem objekata u vlastitom kodu.
Prvo, neka pozadina
Baš kao protivstruktor (the Novi ključna riječ) stvara novu objekt, a destructor je metoda koja se naziva kada je objekt uništen. Ali postoji ulov. Ljudi koji su stvorili .NET shvatili su da je to formula za pogreške ako dva različita dijela koda zapravo mogu uništiti objekt. Dakle .NET GC zapravo kontrolira i obično je jedini kôd koji može uništiti instancu objekta. GC uništava objekt kad se odluči, a ne prije. Normalno je da nakon što neki objekt napusti područje primjene
oslobođen zajedničkim jezikom izvršenja (CLR). GC uništava objekata kada CLR treba više slobodne memorije. Dakle, dno crta je da ne možete predvidjeti kada će GC zapravo uništiti objekt.(Welllll... To je istina skoro cijelo vrijeme. Možeš nazvati GC.Collect i silom a ciklus odvoza smeća, ali vlasti univerzalno kažu da je to loše ideja i posve nepotrebno.)
Na primjer, ako je vaš kôd stvorio kupac objekta, može se činiti da će ga ovaj kod ponovo uništiti.
Kupac = Ništa
Ali ne radi. (Postavljanje objekta Ništa obično se naziva, dereferencing objekta.) U stvari, to samo znači da varijabla više nije povezana s objektom. Nakon nekog vremena, GC će primijetiti da je objekt dostupan za uništenje.
Usput, za upravljane objekte ništa od toga zaista nije potrebno. Iako će objekt poput gumba nuditi metodu raspolaganja, nije ga potrebno koristiti i to malo ljudi učini. Na primjer, komponente sustava Windows Forms dodaju se u objekt spremnika pod nazivom komponente. Kad zatvorite obrazac, njegova metoda Dispose se automatski poziva. Obično se samo o svemu tome morate brinuti kada koristite neupravljane objekte, pa čak i samo onda da optimizirate svoj program.
Preporučeni način za oslobađanje svih resursa koje bi objekt mogao držati je pozivanje Raspolagati metoda za objekt (ako je dostupan), a zatim uklanjanje objekta.
Kupac. Raspolagati() Kupac = Ništa
Budući da će GC uništiti siroti objekt, bilo da postavite varijablu objekta na ništa ili ne, to zapravo nije potrebno.
Drugi preporučeni način da osigurate da se objekti uništavaju kada im više nisu potrebni je stavljanje koda koji koristi objekt u koristeći blok. Korištenje bloka garantira odlaganje jednog ili više takvih resursa kad vaš kod završi s njima.
U GDI + seriji koristeći blok se često koristi za upravljanje tim dosadnim grafičkim objektima. Na primjer ...
Korištenje myBrush kao LinearGradientBrush _. = Novi LinearGradientBrush (_. Mi. ClientRectangle, _. Boja. Plava boja. Crvena, _. LinearGradientMode. horizontalna) <... vi koda ...> Kraj upotrebe
myBrush automatski se uklanja kada se izvrši kraj bloka.
GC pristup upravljanju memorijom velika je promjena od načina na koji je to učinio VB6. COM objekti (koje koristi VB6) uništeni su kad unutarnji brojač referenci dosegne nulu. Ali bilo je previše lako pogriješiti da bi se unutarnji brojač isključio. (Budući da je memorija bila vezana i nije bila dostupna drugim objektima kada se to dogodilo, to se naziva "curenje memorije".) Umjesto toga, GC zapravo provjerava je li nešto referenciralo objekt i uništava ga kad ga nema više reference. GC pristup ima dobru povijest na jezicima kao što je Java i jedno je od velikih poboljšanja u .NET-u.
Na sljedećoj stranici pogledamo u IDisposable sučelje... sučelje koje treba koristiti kad trebate raspolagati neupravljanim objektima u vlastitom kodu.
Ako kodirate vlastiti objekt koji koristi neupravljane resurse, trebali biste ga koristiti IDisposable sučelje za objekt. Microsoft to olakšava uključivanjem isječka koda koji stvara pravi uzorak za vas.
Kliknite ovdje za prikaz ilustracije
Za povratak kliknite gumb Natrag u pregledniku
Dodani kôd izgleda ovako (VB.NET 2008):
Klasa ResourceClass. Provodi IDisposable. 'Za otkrivanje suvišnih poziva. Privatni raspoložen kao bool = lažno. 'Moguće je koristiti. Zaštićeno zamjenjivo podmetanje (_. ByVal raspoređuje kao boole) Ako ne ja.disponiran onda. Ako se onda baci. 'Oslobodite drugu državu (upravljani objekti). Završi ako. 'Oslobodite vlastitu državu (neupravljani objekti). 'Velika polja postavite na nula. Završi ako. Me.disposed = Istina. Kraj Sub. #Region "IDisposable Support" "Ovaj je kôd Visual Basic dodao u. 'pravilno implementirati uzorak za jednokratnu upotrebu. Javna podmetanje () Provodi IDisposable. Raspolagati. 'Ne mijenjajte ovaj kôd. 'Stavite kôd za čišćenje. 'Odložite (ByVal raspoređuje kao Boolean) gore. Odložite (Istina) GC.SuppressFinalize (Me) Kraj Sub. Zaštićena poništavanja Potvrda () 'Ne mijenjajte ovaj kôd. 'Stavite kôd za čišćenje. 'Odložite (ByVal raspoređuje kao Boolean) gore. Odložite (lažno) MyBase. Dovršite () Kraj sub. #End Region. Krajnja klasa
Raspolagati gotovo je "nametnuti" obrazac dizajna za programere u .NET. Zaista postoji samo jedan ispravan način i to je to. Možda mislite da ovaj kod čini nešto čarobno. Ne radi.
Prvo treba imati na umu da je unutarnja zastava sklon jednostavno kratki spoj cijele stvari, tako da možete nazvati Zbrinuti (raspolagati) koliko god puta želite.
Kod ...
GC.SuppressFinalize (Me)
... čini vaš kôd učinkovitijim tako što kažete GC-u da je objekt već odložen ("skupa" operacija u smislu ciklusa izvršenja). Dovršenje je zaštićeno jer ga GC automatski poziva kada uništi objekt. Nikad ne smijete zvati Finalize. Boolean odlaganje kaže kodu je li vaš kôd pokrenuo zbrinjavanje objekta (True) ili je li GC to učinio (kao dio Finalizirajte pod. Imajte na umu da je jedini kod koji koristi boolean odlaganje je:
Ako se onda baci. 'Oslobodite drugu državu (upravljani objekti). Završi ako
Kada odložite predmet, svi se njegovi resursi moraju zbrinuti. Kad CLR sakupljač smeća zbrinjava neki objekt, ne smije se zbrinuti samo neupravljani resurs, jer sakupljač smeća automatski brine o upravljanim resursima.
Ideja iza ovog isječka koda je da dodate kôd da biste se brinuli o upravljanim i neupravljanim objektima na navedenim mjestima.
Kad izvedete predavanje od a osnovna klasa koji implementira IDisposable, ne morate prevladati nijednu osnovnu metodu osim ako ne koristite druge resurse koji također trebaju biti zbrinuti. Ako se to dogodi, izvedena klasa trebala bi nadvladati metodu Dispose (disposition) osnovne klase kako bi raspolagala resursima izvedene klase. Ali zapamtite da biste nazvali metodu Dispose (disposition) osnovne klase.
Zaštićena preklapanja podložite uklanjanju (ByVal uklanja kao boole) ako nije Me.disposed tada. Ako se onda baci. 'Dodajte svoj kôd slobodnim upravljanim resursima. Završi ako. 'Dodajte svoj kôd slobodnim neupravljanim resursima. Završi ako. MyBase. Zbrinuti (raspolagati) Kraj Sub
Predmet može biti malo neodoljiv. Svrha ovdje objašnjenja je „demistificirati“ što se zapravo događa jer većina informacija koje možete pronaći ne govori vam!