Artiklis Objektide uute instantside kodeerimine kirjutasin sellest mitmesugustest viisidest Uus objektide eksemplare saab luua. Objekti käsutamise vastupidine probleem on asi, mille pärast ei pea te VB.NET-is väga sageli muretsema. .NET sisaldab tehnoloogiat nimega Prügikorjaja (GC), mis tavaliselt kulisside taga vaikides ja tõhusalt hoolitseb. Kuid aeg-ajalt, tavaliselt failivoogude, sql-objektide või graafiliste (GDI +) objektide kasutamisel (st haldamata ressursid), peate võib-olla võtma kontrolli oma koodis olevate objektide kõrvaldamise üle.
Esiteks, mõni taust
Just nagu a constructor ( Uus märksõna) loob uue objekt, a destructor on meetod, mida nimetatakse objekti hävitamiseks. Kuid seal on saak. Inimesed, kes lõid .NETi, mõistsid, et see on valem vigadele, kui kaks erinevat kooditükki võivad objekti tegelikult hävitada. Nii et tegelikult kontrollib .NET GC ja see on tavaliselt ainus kood, mis võib objekti eksemplari hävitada. GC hävitab objekti, kui ta seda otsustab ja mitte varem. Tavaliselt on nii pärast seda, kui objekt jätab ulatuse
vabastatud ühise keele käitusaja (CLR) järgi. GC hävitab objekte, kui CLR vajab rohkem vaba mälu. Nii et kokkuvõtlikult võib öelda, et te ei saa ennustada, millal GC objekti tegelikult hävitab.(Welllll... See on tõsi peaaegu kogu aeg. Sa võid helistada GC.Collelect ja sundida a prügiveo tsükkel, kuid võimud väidavad üldiselt, et see on a halb idee ja täiesti ebavajalik.)
Näiteks kui teie kood on loonud a Klient võib tunduda, et see kood hävitab selle uuesti.
Klient = mitte midagi
Aga ei tee. (Objekti määramine väärtusele Midagi nimetatakse tavaliselt, loobumine objekt.) Tegelikult tähendab see lihtsalt seda, et muutujat ei seostata enam objektiga. Mõni aeg hiljem märkab GC, et objekt on hävitamiseks saadaval.
Muide, hallatavate objektide puhul pole see ükski tegelikult vajalik. Kuigi selline objekt nagu nupp pakub dispositsioonimeetodit, pole seda vaja kasutada ja seda teevad vähesed inimesed. Näiteks Windowsi vormide komponendid lisatakse konteinerobjektile nimega komponendid. Vormi sulgemisel kutsutakse selle käsutamise meetod automaatselt. Tavaliselt peate kõige selle pärast muretsema ainult siis, kui kasutate haldamata objekte, ja isegi siis lihtsalt oma programmi optimeerimiseks.
Objekti valduses olevate ressursside vabastamiseks on soovitatav helistada Utiliseerige objekti meetod (kui selline on olemas) ja seejärel objekti väärtuse vähendamine.
Klient. Utiliseeri () Klient = mitte midagi
Kuna GC hävitab omanikuta objekti, sõltumata sellest, kas määrate objekti muutuja väärtuseks Nothing või mitte, pole see tegelikult vajalik.
Teine soovitatav viis veenduda objektide hävimises, kui neid enam ei vajata, on panna objekt kasutav kood a-kirja Kasutades blokeerida. Kasutav plokk tagab ühe või mitme sellise ressursi käsutamise, kui teie kood on nendega valmis.
GDI + sarjas Kasutades Plokki kasutatakse nende ebameeldivate graafikaobjektide haldamiseks üsna sageli. Näiteks ...
Kasutades myBrush'i kui LinearGradientBrush _. = Uus LinearGradientBrush (_. Mina. ClientRectangle, _. Värv. Sinine, värv. Punane, _. LinearGradientMode. Horisontaalne) <... veel koodi ...> Lõpetage kasutamine
myBrush eemaldatakse automaatselt, kui ploki lõpp on täidetud.
GC lähenemine mälu haldamiseks on VB6 viisist suuresti muutunud. COM-objektid (mida kasutab VB6) hävitati, kui sisemine viidete loendur jõudis nullini. Kuid eksimist oli liiga lihtne teha, nii et sisemine loendur oli välja lülitatud. (Kuna mälu oli seotud ja see ei olnud teiste objektide jaoks siis saadaval, siis nimetati seda "mälulekkeks".) Selle asemel kontrollib GC tegelikult, kas miski viitab objektile, ja hävitab selle, kui neid enam pole viited. GC lähenemisviisil on hea ajalugu keeltes, nagu Java, ja see on .NET-i üks suuremaid täiendusi.
Järgmisel lehel uurime kasutatavat liidest... liides, mida kasutatakse siis, kui peate käsitsemata objekte oma koodi käsutama.
Kui kodeerite oma objekti, mis kasutab haldamata ressursse, peaksite kasutama ID käsutuses objekti liides. Microsoft teeb selle lihtsaks, lisades koodilõigu, mis loob teile sobiva mustri.
Illustratsiooni kuvamiseks klõpsake siin
Naasmiseks klõpsake brauseri nupul Tagasi
Lisatud kood näeb välja selline (VB.NET 2008):
Klassi ressursiklass. Rakendused on kasutatavad. 'Üleliigsete kõnede tuvastamiseks. Privaatne käsitatakse kui tõeväärtus = vale. 'ID-käsutuses. Kaitstud ülekõlblik kõrvaldamisala (_. ByVal hävitab tõeväärtusena) Kui mitte, siis käsutan siis. Kui siis käsutada, siis. 'Vaba muu riik (hallatavad objektid). Lõpeta If. 'Vabastage oma riik (haldamata objektid). 'Seadke suured väljad olematuks. Lõpeta If. Me.disposed = tõsi. Lõpu alam. #Regioon "IDisposable Support" 'Selle koodi on Visual Basicu lisanud. 'rakendage ühekordselt kasutatav muster õigesti. Avalik alamjaotus () rakendatakse isikukõlbmatuks. Utiliseerige. 'Ära muuda seda koodi. 'Pange puhastuskood sisse. 'Kõrvaldage (ByVal käsutab tõeväärtusena) ülalpool. Kõrvaldage (tõene) GC.SuppressFinalize (Me) End Sub. Protected Overrides Sub Finalize () 'Ärge muutke seda koodi. 'Pange puhastuskood sisse. 'Kõrvaldage (ByVal käsutab tõeväärtusena) ülalpool. Likvideerige (vale) MyBase. Lõpeta () End Sub. #End piirkond. Lõpuklass
Utiliseerige on .NET-is peaaegu "jõustatud" arendaja kujundusmuster. Selle tegemiseks on tõesti ainult üks õige viis ja see on see. Võite arvata, et see kood teeb midagi maagilist. Seda ei tehta.
Esiteks pange tähele, et sisemine lipp võõrandatud lihtsalt lühi kogu asi, nii et saate helistada Utiliseerima (utiliseerima) nii tihti kui soovite.
Kood ...
GC.SuppressFinaliseeri (mina)
... muudab teie koodi tõhusamaks, öeldes GC-le, et objekt on juba realiseeritud (täitmistsüklite mõttes "kallis" toiming). Lõpetamine on kaitstud, kuna GC kutsub seda objekti hävitamisel automaatselt välja. Te ei tohiks kunagi helistada Finalise'i. Boolean utiliseerimine näitab koodi, kas teie kood algatas objekti käsutamise (tõene) või kas GC tegi seda (osana funktsioonist) Lõpeta sub. Pange tähele, et ainus kood, mis kasutab Boolean-koodi utiliseerimine on:
Kui siis käsutada, siis. 'Vaba muu riik (hallatavad objektid). Lõpeta If
Objekti käsutamisel tuleb kõik selle ressursid utiliseerida. Kui CLR prügikorjaja objekti utiliseerimisel tuleb utiliseerida ainult majandamata ressursid, kuna prügivedaja hoolitseb hallatavate ressursside eest automaatselt.
Selle koodilõigu mõte on see, et lisate koodi märgitud asukohtades hallatavate ja haldamata objektide hooldamiseks.
Kui tuletate klassi a-st põhiklass, mis rakendab IDisposable, ei pea te ühtegi põhimeetodit alistama, kui kasutate muid ressursse, mis tuleb ka käsutada. Kui see juhtub, peaks tuletatud klass tuletatud klassi ressursside käsutamiseks alistama põhiklassi käsutamise (käsutamise) meetodi. Kuid ärge unustage helistada põhiklassi käsutamise meetodile.
Kaitstud alistab alajaotuse (ByVal utiliseerib kui tõeväärtus), kui mitte, siis käsutame siis. Kui siis käsutada, siis. 'Lisage oma kood tasuta hallatavatele ressurssidele. Lõpeta If. 'Lisage oma kood haldamata ressursside vabaks saamiseks. Lõpeta If. MyBase. Utiliseerima (utiliseerima) Lõpu alam
Teema võib olla pisut üleolev. Siinse selgituse eesmärk on tegelikult toimuvat "demüstifitseerida", kuna suurem osa leitavast teabest ei ütle seda teile!