Programmēšana

Labākā prakse, kā izmantot .Net utilizēt un pabeigt

Microsoft .Net Framework nodrošina atkritumu savācēju, kas darbojas fonā un atbrīvo pārvaldīto objektu aizņemto atmiņu, kad uz tiem vairs nav atsauces jūsu kodā. Kaut arī atkritumu savācējs ir prasmīgs, lai attīrītu atmiņu, ko aizņem pārvaldītie objekti, netiek garantēts, ka atmiņa, ko aizņem nepārvaldīti objekti, tiktu iztīrīta, kad tiks izpildīts nākamais GC cikls. Ja jūsu lietojumprogrammā ir nepārvaldīti resursi, jums ir jāpārliecinās, ka šādi resursi tiek skaidri izlaisti, kad esat tos izmantojis. Šajā rakstā es uzsvēršu labāko praksi, kas jums jāievēro, lai sakoptu jūsu lietojumprogrammā izmantotos resursus.

GC izmanto paaudzes, lai uzturētu un pārvaldītu atmiņā izveidoto objektu relatīvo kalpošanas laiku. Objekti, kas tiek izveidoti jauni, tiek ievietoti 0. paaudzē. Pamatpieņēmums ir tāds, ka jaunizveidotam objektam var būt īsāks dzīves laiks, savukārt vecam objektam - ilgāks dzīves laiks. Kad objekti, kas dzīvo 0. paaudzē, pēc GC cikla netiek atgūti, tie tiek pārvietoti uz 1. paaudzi. Līdzīgi, ja 1. paaudzes objekti pārdzīvo GC tīrīšanu, tie tiek pārvietoti uz 2. paaudzi. Ņemiet vērā, ka GC darbojas biežāk zemākām paaudzēm, kas augstākajās. Tātad objekti, kas dzīvo 0. paaudzē, tiktu tīrīti biežāk, salīdzinot ar objektiem, kas atrodas 1. paaudzē. Tātad, labāk ir programmēt, lai nodrošinātu, ka tiek izmantoti vairāk lokāli objekti, kas atrodas augstākā diapazonā, lai izvairītos no objektu pārvietošanas augstākām paaudzēm.

Ņemiet vērā, ka tad, kad jūsu klasē ir destruktors, izpildlaiks to uzskata par metodi Finalize (). Tā kā pabeigšana ir dārga, iznīcinātājus izmantojiet tikai tad, ja nepieciešams - kad jūsu klasē ir daži resursi, kas jums būtu jātīra. Kad jūsu klasē ir finālists, šo klašu objekti tiek pārvietoti uz pabeigšanas rindu. Ja objekti ir sasniedzami, tie tiek pārvietoti uz "Freachable" rindu. GC atgūst atmiņu, kuru aizņem objekti, kas nav sasniedzami. Periodiski GC pārbauda, ​​vai objekti, kas atrodas rindā "Freachable", ir sasniedzami. Ja tie nav sasniedzami, atmiņa, ko aizņem šie objekti, tiek atgūta. Tātad ir skaidrs, ka objektiem, kas atrodas rindā "Saprotams", atkritumu savācējam būtu vajadzīgs vairāk laika, lai tos notīrītu. Tā ir slikta prakse, ka jūsu C # klasē ir tukši iznīcinātāji, jo objekti šādām klasēm tiek pārvietoti uz pabeigšanas rindu un pēc tam uz "Freachable" rindu, ja nepieciešams.

Kad objekta aizņemtā atmiņa tiek atgūta, netieši tiek izsaukts finālists. Tomēr GC negarantē, ka finālistu izsauks - to var izsaukt vai nemaz. Būtībā finālists darbojas nedeterministiskā režīmā - izpildlaiks negarantē, ka finālists vispār tiks izsaukts. Tomēr varat piespiest izsaukt finālistu, lai gan tā nebūt nav laba prakse, jo ir saistīti izpildes sodi. Galīgajiem dalībniekiem vienmēr jābūt aizsargātiem, un tie vienmēr jāizmanto tikai pārvaldīto resursu sakopšanai. Nekad nevajadzētu piešķirt atmiņu pabeigšanas ierīcē, rakstīt kodu, lai ieviestu pavedienu drošību, vai izsaukt virtuālās metodes no pabeigšanas ierīces.

No otras puses, iznīcināšanas metode nodrošina "deterministiskas tīrīšanas" pieeju resursu tīrīšanai .Net. Tomēr atšķirībā no pabeigšanas metode Atbrīvošanās metode ir skaidri jāizsauc. Ja klasē ir definēta iznīcināšanas metode, pārliecinieties, vai tā tiek izsaukta. Tātad, iznīcināšanas metode ir skaidri jāsauc klienta kodam. Bet ko tad, ja esat aizmirsis izsaukt iznīcināšanas metodi, kas pakļauta klasei, kas izmanto nepārvaldītus resursus? Klientiem no klases, kas ievieš IDisposable saskarni, instances ir skaidri jāizsauc metode Atbrīvoties. Šajā gadījumā jums jāzvana Iznīcināt no finišētāja. Šī automātiskā deterministiskā pabeigšanas stratēģija nodrošina jūsu kodā izmantoto nepārvaldīto resursu sakopšanu.

IDisposable ir jāievieš visiem tipiem, kuriem ir pabeigšanas ierīce. Ieteicamā prakse ir gan iznīcināt, gan pabeigt, kad jūsu klasē ir nepārvaldīti resursi.

Šis koda fragments parāda, kā C # var ieviest modeli Iznīcināt pabeigšanu.

aizsargāts virtuālais tukšums Iznīcināt (Bool iznīcināšana)

        {

ja (iznīcināt)

            {

// rakstīt kodu sakopšanai pārvaldītajos objektos

            }

// rakstīt kodu, lai attīrītu nepārvaldītos objektus un resursus

        }

Šo parametrizēto iznīcināšanas metodi var automātiski izsaukt no iznīcinātāja, kā parādīts zemāk esošajā koda fragmentā.

~ Resursi ()

        {

ja (! iznīcināts)

            {

disposed = true;

Atbrīvoties (nepatiesa);

            }

        }

$config[zx-auto] not found$config[zx-overlay] not found