Apglabājiet objektus Visual Basic

Rakstā Objektu jauno eksemplāru kodēšana es rakstīju par dažādiem veidiem Jauns Var izveidot objektu gadījumus. Pretēja problēma, kas saistīta ar objekta izvietošanu, ir tāda, par kuru VB.NET jums nevajadzēs uztraukties ļoti bieži. .NET ietver tehnoloģiju ar nosaukumu Atkritumu savācējs (GC), kas parasti klusībā un efektīvi rūpējas par visu, kas atrodas aiz ainas. Bet reizēm, parasti, izmantojot failu straumes, SQL objektus vai grafikas (GDI +) objektus (tas ir, nepārvaldīti resursi), iespējams, nāksies kontrolēt objektu iznīcināšanu savā kodā.

Pirmkārt, daži pamati

Tāpat kā a constructor ( Jauns atslēgvārds) izveido jaunu objekts, a destructor ir metode, ko sauc, ja objekts tiek iznīcināts. Bet tur ir nozveja. Cilvēki, kas izveidoja .NET, saprata, ka tā ir kļūdu formula, ja divi dažādi koda fragmenti faktiski var iznīcināt objektu. Tātad. NET GC faktiski kontrolē, un tas parasti ir vienīgais kods, kas var iznīcināt objekta instanci. GC iznīcina objektu, kad tas nolemj, bet ne agrāk. Parasti pēc objekta atstāšanas darbības joma tā ir

instagram viewer
atbrīvots pēc kopējās valodas izpildlaika (CLR). GC iznīcina objektus, kad CLR nepieciešama vairāk brīvas atmiņas. Tātad būtība ir tāda, ka jūs nevarat paredzēt, kad GC faktiski iznīcinās objektu.

(Welllll... Tā ir taisnība gandrīz visu laiku. Jūs varat piezvanīt GC.Collection un piespiest a atkritumu savākšanas cikls, bet iestādes vispārīgi saka, ka tas ir a slikti ideja un pilnīgi nevajadzīga.)

Piemēram, ja jūsu kods ir izveidojis Klients objekts, var šķist, ka šis kods to atkal iznīcinās.

Klients = nekas

Bet tā nav. (Objekta iestatīšana uz Nekas parasti netiek saukta, atsaukšana objekts.) Patiesībā tas nozīmē tikai to, ka mainīgais vairs nav saistīts ar objektu. Pēc kāda laika GC pamanīs, ka objekts ir pieejams iznīcināšanai.

Starp citu, pārvaldītiem objektiem tas viss nav īsti nepieciešams. Lai arī tāds objekts kā poga piedāvās disponēšanas metodi, to izmantot nav nepieciešams, un to nedaudza cilvēki. Piemēram, Windows veidlapu komponenti tiek pievienoti konteinera objektam ar nosaukumu sastāvdaļas. Aizverot veidlapu, tās apglabāšanas metode tiek izsaukta automātiski. Parasti par visu šo jums jāuztraucas tikai tad, ja tiek izmantoti nepārvaldīti objekti, un pat tad, lai optimizētu savu programmu.

Ieteicamais veids, kā atbrīvot visus resursus, kas varētu būt objekta rīcībā, ir izsaukšana Apglabājiet objekta metode (ja tāda ir pieejama) un pēc tam objekta atcelšana.

Klients. Apglabāt () Klients = nekas

Tā kā GC iznīcinās bāreņu objektu neatkarīgi no tā, vai objekta mainīgo iestatījāt uz Nothing, tas nav īsti nepieciešams.

Vēl viens ieteicamais veids, kā pārliecināties, ka objekti tiek iznīcināti, kad tie vairs nav nepieciešami, ir koda ievietošana objektā Izmantojot bloķēt. Izmantojot bloku, tiek garantēts viena vai vairāku šādu resursu iznīcināšana, kad ar tiem ir pabeigts jūsu kods.

GDI + sērijā Izmantojot Bloks tiek izmantots diezgan bieži, lai pārvaldītu šos nepatīkamos grafikas objektus. Piemēram ...

Izmantojot MyBrush kā LinearGradientBrush _. = Jauns LinearGradientBrush (_. Es. ClientRectangle, _. Krāsa. Zila, krāsa. Sarkans, _. LinearGradientMode. Horizontāli) <... vair koda ...> Beigt lietošanu

myBrush tiek automātiski iznīcināts, kad tiek izpildīts bloka beigas.

GC pieeja atmiņas pārvaldībai ir lielas izmaiņas no tā, kā to darīja VB6. COM objekti (izmanto VB6) tika iznīcināti, kad iekšējais atsauces skaitītājs sasniedza nulli. Bet kļūdīties bija pārāk viegli, tāpēc iekšējais skaitītājs bija izslēgts. (Tā kā atmiņa bija piesaistīta un nebija pieejama citiem objektiem, kad tas notika, to sauca par "atmiņas noplūdi".) Tā vietā GC faktiski pārbauda, ​​vai kaut kas atsaucas uz objektu, un iznīcina to, kad tādu vairs nav atsauces. GC pieejai ir laba vēsture tādās valodās kā Java, un tā ir viens no lielākajiem .NET uzlabojumiem.

Nākamajā lapā mēs aplūkojam IDisposable interfeisu... saskarne, kas jāizmanto, ja savā kodā ir jāiznīcina nepārvaldīti objekti.

Ja kodējat savu objektu, kas izmanto nepārvaldītus resursus, jums jāizmanto Neizmantojams objekta interfeiss. Microsoft to atvieglo, iekļaujot koda fragmentu, kas rada jums piemērotu modeli.


Noklikšķiniet šeit, lai parādītu ilustrāciju
Noklikšķiniet uz pogas Atpakaļ pārlūkprogrammā, lai atgrieztos

Pievienotais kods izskatās šādi (VB.NET 2008):

 Klases ResourceClass. Īsteno IDS. 'Lai atklātu liekus zvanus. Privāts atsavināts kā Būla = Nepatiess. 'Neizmantojams. Aizsargāts pārāk izturīgs atkritumu iznīcināšanas līdzeklis (_. ByVal apglabā kā Būla), ja ne Me.disposed Tad. Ja apglabā tad. 'Atbrīvo citu valsti (pārvaldītus objektus). Beigt ja. 'Atbrīvojiet savu valsti (nepārvaldīti objekti). 'Iestatiet lielus laukus uz nulli. Beigt ja. Me.disposed = True. Beigas apakš. #Regions "IDisposable Support" 'Šo kodu Visual Basic pievienoja vietnei. 'pareizi ieviest vienreiz lietojamo zīmējumu. Publiskais sub-utilizators () tiek ieviests ar personālu. Apglabājiet. Nemainiet šo kodu. Ievietojiet tīrīšanas kodu. 'Atbrīvojieties (ByVal rīkojas kā Būla). Apglabājiet (patiesi) GC.SuppressFinalize (Me) beigas Sub. Protected Overrides Sub Finalize () 'Nemainiet šo kodu. Ievietojiet tīrīšanas kodu. 'Atbrīvojieties (ByVal rīkojas kā Būla). Apglabājiet (nepatiesu) MyBase. Pabeigt () Beigt apakšdaļu. #End reģions. Beigu klase 

Apglabājiet ir gandrīz "piespiedu" izstrādātāja dizaina modelis .NET. Tas tiešām ir tikai viens pareizais veids, kā to izdarīt, un tas ir tas. Jūs varētu domāt, ka šis kods dara kaut ko maģisku. Tā nav.

Vispirms ņemiet vērā, ka iekšējais karogs atsavināts vienkārši īssavieno visu lietu, lai jūs varētu piezvanīt Apglabāt (apglabāt) tik bieži, cik vēlaties.

Kods ...

 GC.SuppressFinalize (Me) 

... padara jūsu kodu efektīvāku, sakot GC, ka objekts jau ir iznīcināts (“dārga” operācija izpildes ciklu izteiksmē). Pabeigšana ir aizsargāta, jo GC to automātiski izsauc, kad objekts tiek iznīcināts. Jums nekad nevajadzētu piezvanīt uz Finalize. Būla apglabāšana norāda kodu, vai jūsu kods iniciēja objekta iznīcināšanu (True) vai arī GC to darīja (kā daļu no Pabeigt apakš. Ņemiet vērā, ka vienīgais kods, kas izmanto Būla kodu apglabāšana ir:

 Ja apglabā tad. 'Atbrīvo citu valsti (pārvaldītus objektus). Beigt ja 

Apglabājot objektu, ir jāiznīcina visi tā resursi. Kad CLR atkritumu savācējs iznīcinot objektu, jāiznīcina tikai neapsaimniekotie resursi, jo atkritumu savācējs automātiski rūpējas par pārvaldītajiem resursiem.

Šī koda fragmenta ideja ir pievienot kodu, lai rūpētos par pārvaldītajiem un nepārvaldītajiem objektiem norādītajās vietās.

Kad jūs atvasināt klasi no bāzes klase kas ievieš IDisposable, jums nav jāpārsniedz neviena no pamatmetodēm, ja vien neizmantojat citus resursus, kuri arī ir jāiznīcina. Ja tas notiek, atvasinātajai klasei būtu jāpārspēj bāzes klases Dispose (disposing) metode, lai atbrīvotos no atvasinātās klases resursiem. Bet atcerieties, ka jāizsauc bāzes klases Dispose (disposing) metode.

Aizsargāts ignorē sub-utilizāciju (ByVal iznīcina kā Būla), ja to neizmanto. Pēc tam. Ja apglabā tad. Pievienojiet savu kodu bezmaksas pārvaldītajiem resursiem. Beigt ja. Pievienojiet savu kodu bezmaksas nepārvaldītiem resursiem. Beigt ja. MyBase. Apglabāt (apglabāt) Beigas apakš

Tēma var būt nedaudz satriecoša. Šeit sniegtā paskaidrojuma mērķis ir "dezinficēt" patiesībā notiekošo, jo lielākā daļa informācijas, ko varat atrast, jums to neizsaka!

instagram story viewer