Objektin uusien esineiden koodaaminen -artikkelissa kirjoitin erilaisista tavoista Uusi objektien esiintymiä voidaan luoda. Päinvastainen ongelma, esineen hävittäminen, on asia, josta sinun ei tarvitse huolehtia VB.NET-sivustosta kovin usein. .NET sisältää tekniikan nimeltä Roskankerääjä (GC), joka yleensä hoitaa kaiken kulissien takana hiljaa ja tehokkaasti. Mutta joskus, yleensä käytettäessä tiedostovirtoja, SQL-objekteja tai grafiikka (GDI +) -objekteja (ts. hallitsemattomat resurssit), saatat joutua ottamaan hallinnan objektien hävittämisestä omassa koodissasi.
Ensinnäkin, taustaa
Aivan kuten huijausstructor ( Uusi avainsana) luo uuden esine, a destructor on menetelmä, jota kutsutaan, kun esine tuhoutuu. Mutta siellä on saalis. .NET: n luoneet ihmiset ymmärsivät, että se oli kaava virheille, jos kaksi erilaista koodipalaa voisivat todella tuhota objektin. Joten .NET GC on tosiasiallisesti hallinnassa ja se on yleensä ainoa koodi, joka voi tuhota objektin ilmentymän. GC tuhoaa esineen päättäessään eikä aikaisemmin. Yleensä, kun esine jättää soveltamisalan, se on
julkaisi yhteisen kielen ajon (CLR) avulla. GC tuhoaa kohteita, kun CLR tarvitsee enemmän vapaata muistia. Joten lopullinen asia on, että et voi ennustaa, milloin GC tuhoaa objektin.(Welllll... Se on totta lähes Kaiken aikaa. Voit soittaa GC.Collect ja pakottaa a roskien keräyssykli, mutta viranomaiset sanovat yleisesti, että se on huono idea ja täysin tarpeeton.)
Esimerkiksi, jos koodisi on luonut asiakas objekti, voi tuntua, että tämä koodi tuhoaa sen uudestaan.
Asiakas = ei mitään
Mutta ei. (Objektin asettaminen nollaksi kutsutaan yleisesti, dereferencing objekti.) Oikeastaan se tarkoittaa vain, että muuttujaa ei enää liitetä objektiin. Jonkin ajan kuluttua GC huomauttaa, että esine on hävitettävä.
Muuten hallittujen kohteiden tapauksessa mikään tämä ei ole oikeasti välttämätöntä. Vaikka painikkeen kaltainen esine tarjoaa hävitysmenetelmän, sitä ei tarvitse käyttää, ja harvat ihmiset tekevät. Esimerkiksi Windows Forms -komponentit lisätään nimeltään säilöobjektiin komponentit. Kun suljet lomakkeen, sen hävitysmenetelmää kutsutaan automaattisesti. Yleensä jokaisesta tästä on huolehdittava vain käyttäessäsi hallitsemattomia objekteja ja silloin vain optimoidaksesi ohjelman.
Suositeltu tapa vapauttaa kaikki objektin hallussa olevat resurssit on soittaa hävitä menetelmä objektille (jos sellainen on käytettävissä) ja sitten objektin poisto.
Asiakas. Hävitä () Asiakas = ei mitään
Koska GC tuhoaa orvoksi otetun objektin, riippumatta siitä, asetatko objektimuuttujan arvoon Ei mitään, se ei ole oikeasti välttämätöntä.
Toinen suositeltava tapa varmistaa, että esineet tuhoutuvat, kun niitä ei enää tarvita, on laittaa objektia käyttävä koodi a-koodiin käyttämällä lohko. A Lohkon käyttö takaa yhden tai useamman tällaisen resurssin hävittämisen, kun koodisi on valmis niiden kanssa.
GDI + -sarjassa käyttämällä lohkoa käytetään melko usein näiden hankalien grafiikkaobjektien hallintaan. Esimerkiksi ...
MyBrush-sovelluksen käyttäminen LinearGradientBrush -sovelluksena _. = Uusi LinearGradientBrush (_. Minä. ClientRectangle, _. Väri. Sininen, väri. Punainen, _. LinearGradientMode. vaakasuora) <... lis koodia ...> Lopeta käyttö
myBrush hävitetään automaattisesti, kun lohkon loppu suoritetaan.
GC-lähestymistapa muistin hallintaan on suuri muutos tapaan, jolla VB6 teki sen. COM-objektit (joita VB6 käyttää) tuhottiin, kun sisäinen viitelaskuri saavutti nollan. Mutta se oli liian helppo tehdä virhe, joten sisäinen laskuri oli pois päältä. (Koska muisti oli sidottu, eikä sitä ollut saatavana muihin kohteisiin, kun tämä tapahtui, sitä kutsuttiin "muistivuotoksi".) Sen sijaan GC tarkistaa tosiasiallisesti, viittaako jokin objektiin, ja tuhoaa sen, kun niitä ei enää ole viittauksia. GC-lähestymistavalla on hyvä historia Java-kaltaisilla kielillä ja se on yksi suurimmista parannuksista .NET: ssä.
Seuraavalla sivulla tarkastelemme Henkilökohtaista käyttöliittymää... käyttöliittymä käytettäväksi, kun joudut hävittämään hallitsemattomat objektit omaan koodiin.
Jos koodaat omaa objektiasi, joka käyttää hallitsemattomia resursseja, sinun tulee käyttää IDisposable objektin käyttöliittymä. Microsoft tekee tämän helpoksi sisällyttämällä koodinpätkän, joka luo sinulle oikean mallin.
Napsauta tätä nähdäksesi kuvan
Napsauta selaimen Takaisin-painiketta palataksesi
Lisätty koodi näyttää tältä (VB.NET 2008):
Class ResourceClass. Toteuttaa henkilökohtaisesti. 'Tarpeettomien puheluiden havaitsemiseksi. Yksityinen luovutettu kuten looginen = väärä. 'Henkilökohtainen. Suojattu yliohjautuva alijääte (_. ByVal hävittää booleanäytteenä) Jos ei, niin halutaan sitten. Jos hävitetään sitten. 'Vapaa muu osavaltio (hallitut objektit). Loppu Jos. 'Vapauta oma valtio (hallitsemattomat esineet). 'Aseta suuret kentät nollaksi. Loppu Jos. Me.disposed = Totta. End Sub. #Alue "Henkilökohtainen tuki" 'Tämän koodin on Visual Basic lisännyt. 'toteuta kertakäyttömalli oikein. Julkinen alijäämä () toteutetaan henkilökohtaisesti. Hävitä. 'Älä muuta tätä koodia. 'Laita puhdistuskoodi sisään. 'Hävitä (ByVal hävittää loogisena) yllä. Hävitä (totta) GC.SuppressFinalize (Me) End Sub. Protected Overrides Sub Finalize () 'Älä muuta tätä koodia. 'Laita puhdistuskoodi sisään. 'Hävitä (ByVal hävittää loogisena) yllä. Hävitä (väärä) MyBase. Viimeistele () End Sub. #End alue. Loppu luokka
hävitä on melkein "pakotettu" kehittäjäsuunnittelumalli .NET: ssä. On todella vain yksi oikea tapa tehdä se ja tämä se on. Saatat ajatella, että tämä koodi tekee jotain taikuutta. Se ei.
Huomaa ensin, että sisäinen lippu sijoitettu yksinkertaisesti oikosulkee koko juttu, jotta voit soittaa Hävittää (hävittää) niin usein kuin haluat.
Koodi ...
GC.SuppressFinalize (Me)
... tekee koodistasi tehokkaamman kertomalla GC: lle, että objekti on jo luovutettu ("kallis" operaatio suoritussyklien suhteen). Viimeistele on suojattu, koska GC kutsuu sitä automaattisesti, kun esine tuhoutuu. Älä koskaan soita Viimeistele. Boolean hävittää kertoo koodin, aloittiko koodi objektin hävittämisen (True) vai onko GC tehnyt sen (osana viimeistelynilmaisulaitteen sub. Huomaa, että ainoa koodi, joka käyttää Boolen koodia hävittää On:
Jos hävitetään sitten. 'Vapaa muu osavaltio (hallitut objektit). Loppu Jos
Kun hävität esineen, kaikki sen resurssit on hävitettävä. Kun CLR roskankerääjä esineen hävittämisessä vain hallitsemattomat resurssit on hävitettävä, koska jätteiden kerääjä huolehtii automaattisesti hallituista resursseista.
Tämän koodinpätkän idea on, että lisäät koodin huolehtimaan hallituista ja hallitsemattomista kohteista ilmoitetuissa paikoissa.
Kun johdat luokkaa a: sta perusluokka, joka toteuttaa IDisposable, sinun ei tarvitse ohittaa mitään perusmenetelmistä, ellet käytä muita resursseja, jotka myös on hävitettävä. Jos näin tapahtuu, johdetun luokan tulee ohittaa perusluokan Dispose (disposing) -menetelmä johdetun luokan resurssien hävittämiseksi. Muista kuitenkin soittaa perusluokan hävittämismenetelmälle.
Suojattu ohittaa alijäämän (ByVal hävittää Boole-nimisenä), jos ei ole Me.sopii sitten. Jos hävitetään sitten. 'Lisää koodisi ilmaisiin hallinnoituihin resursseihin. Loppu Jos. 'Lisää koodisi ilmaisiin hallitsemattomiin resursseihin. Loppu Jos. MyBase. Hävittää (hävittää) End Sub
Aihe voi olla hieman ylivoimainen. Selityksen tarkoituksena on "demystifioida" tosiasiallisesti tapahtuva, koska suurin osa löytämistäsi tiedoista ei kerro sinulle!