Programmēšana

Mani divi centi par vājām atsaucēm .Net

GC ir prasmīgs, lai atgūtu pārvaldīto objektu aizņemto atmiņu. Tomēr, lai uzlabotu lietojumprogrammu darbību, jums jāveic papildu pasākumi, lai atvieglotu atkritumu savākšanu.

Vāja atsauce ir atsauce uz objektu atmiņā, vienlaikus ļaujot atkritumu savācējam savākt objektu vai atgūt objekta aizņemto atmiņu, darbojoties GC. Objekts, kas ir sasniedzams, nav atkritumi, kurus savāc izpildlaiks.

Objektiem, kas patērē daudz atmiņas, varat izmantot vājas atsauces. Izmantojot vājas atsauces uz šādiem objektiem, jūs iespējojat šos objektus savākt atkritumos, vienlaikus ļaujot šos objektus pēc vajadzības atjaunot vēlāk. Tātad, ja jūsu lietojumprogrammā ir liels objekts, kuru izmantojat retāk, varat izmantot vāju atsauci uz šādiem objektiem, ja šādu objektu atjaunošana nav tik dārga.

Ņemiet vērā, ka, izveidojot vāju atsauci uz objektu, IntPtr uz GCHandle iekšēji glabā jūsu izveidotā vāja atsauce. Izpildlaiks izmanto šo GCHandle, lai pārvaldītu tabulu, kurā ir vājas atsauces uz objektiem. Ja objekts jau ir savākts, atkritumu IntPtr vērtība būs IntPtr.Zero. Kad vāja atsauce uz objektu ir pabeigta, tiek noņemts atbilstošais vājas atsauces uz objektu ieraksts vājās atsauces tabulā. Ja vāja atsauce uz objektu joprojām ir dzīva un jūs uz vājās atsauces izsaucat mērķi Target, tiek atgriezts faktiskais objekts, uz kuru norāda vājās atsauces GCHandle.

Vājas atsauces uz objektu izveidošana nepalielina objekta dzīves laiku. Tas ļauj atkritumu savācējam atgūt objekta aizņemto atmiņu, ja nav spēcīgu atsauču uz šo objektu. Atšķirība starp vāju un spēcīgu atsauci uz objektu ir tāda, ka, lai gan pirmais ļauj atkritumu savācējam atgūt šī objekta aizņemto atmiņu, spēcīga norāde uz objektu neļauj atkritumu savācējam atgūt atmiņu, kuru aizņem objekts. šo objektu, ja objekts ir sasniedzams.

Programmēt vāju atsauci C #

Lai izveidotu vāju atsauci, jums jāizmanto System.WeakReference klases priekšrocības. Kad esat izveidojis vāju atsauci uz objektu, varat izmantot izveidotās vājās atsauces rekvizītu Target, lai pārbaudītu, vai sākotnējais objekts joprojām ir dzīvs. Šis koda fragments parāda, kā jūs varat izveidot vāju atsauci uz objektu.

Taisnstūra taisnstūris = jauns Taisnstūris (15, 10);

var heikReference = jauna WeakReference (taisnstūris);

Varat izmantot rekvizītu IsAlive, lai pārbaudītu, vai vāja atsauce uz objektu joprojām ir dzīva. Šeit ir kodu saraksts, kas to ilustrē.

static void Main (virkne [] args)

        {

Taisnstūra taisnstūris = jauns Taisnstūris (15, 10);

var heikReference = jauna WeakReference (taisnstūris);

taisnstūris = nulle;

bool isAlive = vāja atsauce.IsAlive;

ja (isAlive)

Console.WriteLine ("Objekts joprojām ir dzīvs");

Konsole. Lasīt ();

        }

Ja stipra atsauce uz objektu vairs nav pieejama, varat izmantot vājas atsauces rekvizītu Target, lai izmantotu objektu, kā parādīts tālāk sniegtajā koda fragmentā.

bool isAlive = vāja atsauce.IsAlive;

ja (isAlive)

{

Taisnstūra taisnstūris = vāja atsauce. Mērķis kā taisnstūris;

// Tagad jūs varat izmantot taisnstūra objektu kā parasti

}

Īsas un ilgstošas ​​vājas atsauces

Vājās atsauces var būt gan īslaicīgas, gan ilgstošas. Primārā atšķirība starp īso un vājo atsauci ir tāda, ka, ja pirmajā gadījumā vājas atsauces rekvizīts Mērķis kļūst nulle, ja GC atgūst objektu, otrajā gadījumā ilgi vāja atsauce ir dzīva arī pēc GC darbības, ti, tā pārdzīvo GC ciklu. Ņemiet vērā, ka uzmanīgi jālieto garas vājas atsauces, jo objekta stāvokli pēc pabeigšanas nevar paredzēt.

Būtībā, ja vēlaties izmantot objektu, kas atrodas izmantojamā stāvoklī, jums jāizmanto īsas vājas atsauces. Gluži pretēji, gara vāja atsauce ir laba izvēle, ja vēlaties izmantot objektu neatkarīgi no tā stāvokļa. Lai izveidotu garu vāju atsauci, jums ir jānodod “true” kā otrais parametrs WeakReference klases pārslogotajam konstruktoram, vienlaikus izveidojot vājo atsauci. Tālāk parādītais koda fragments to ilustrē.

Taisnstūra taisnstūris = jauns Taisnstūris (15, 10);

var heikReference = jauna WeakReference (taisnstūris, taisnība);

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