Programmering

Mine to cent på svake referanser i .Net

GC er dyktig i å gjenvinne minnet okkupert av administrerte objekter. Du bør imidlertid ta ekstra tiltak for å lette søppeloppsamling for å forbedre ytelsen til applikasjonene dine.

En svak referanse er en som refererer til et objekt i minnet, samtidig som det gjør det mulig for søppeloppsamleren å samle gjenstanden eller gjenvinne minnet okkupert av objektet når GC kjører. Et objekt som kan nås, blir ikke søppel samlet inn av kjøretiden.

Du kan bruke svake referanser for objekter som bruker mye minne. Når du bruker svake referanser for slike gjenstander, lar du disse gjenstandene samle søppel, samtidig som du lar dem gjenopprette senere hvis det er nødvendig. Så hvis du har et stort objekt i applikasjonen som du vil bruke sjeldnere, kan du bruke svak referanse til slike objekter, forutsatt at det ikke er så dyrt å gjenskape slike objekter.

Merk at når du oppretter en svak referanse til et objekt, lagres en IntPtr til en GCHandle internt av den svake referansen du har opprettet. Kjøretiden bruker denne GCHandle til å administrere en tabell som inneholder svake referanser til objekter. Hvis et objekt allerede har blitt samlet inn søppel, vil verdien av IntPtr være IntPtr.Zero. Når den svake referansen til objektet er ferdig, fjernes den tilsvarende oppføringen av den svake referansen til objektet i den svake referansetabellen. Hvis den svake referansen til objektet fremdeles er i live, og du påkaller Target-egenskapen på den svake referansen, returneres det faktiske objektet som GCHandle til den svake referansen peker på.

Å lage en svak referanse til et objekt øker ikke objektets levetid. Det gjør det mulig for søppeloppsamleren å gjenvinne minnet okkupert av objektet når det ikke finnes sterke referanser til det objektet. Forskjellen mellom en svak og sterk referanse til et objekt er at mens førstnevnte fortsatt tillater søppeloppsamleren å gjenvinne minnet okkupert av det objektet, tillater ikke en sterk referanse til et objekt søppeloppsamleren å gjenvinne minnet okkupert av det objektet hvis objektet er tilgjengelig.

Programmering av svak referanse i C #

For å lage en svak referanse må du dra nytte av klassen System.WeakReference. Når du har opprettet en svak referanse til et objekt, kan du bruke målegenskapen til den svake referansen du har opprettet for å sjekke om det opprinnelige objektet fremdeles er i live. Følgende kodebit viser hvordan du kan lage en svak referanse til et objekt.

Rektangelrektangel = nytt rektangel (15, 10);

var weakReference = ny WeakReference (rektangel);

Du kan bruke IsAlive-egenskapen til å sjekke om den svake referansen til objektet fremdeles er i live. Her er en kodeliste som illustrerer dette.

statisk tomrom Main (streng [] args)

        {

Rektangelrektangel = nytt rektangel (15, 10);

var weakReference = ny WeakReference (rektangel);

rektangel = null;

bool isAlive = weakReference.IsAlive;

hvis (isAlive)

Console.WriteLine ("Objektet lever fortsatt");

Console.Read ();

        }

Hvis den sterke referansen til objektet ikke lenger er tilgjengelig, kan du bruke Target-egenskapen til den svake referansen til å bruke objektet som vist i kodebiten gitt nedenfor.

bool isAlive = weakReference.IsAlive;

hvis (isAlive)

{

Rektangelrektangel = weakReference.Target som Rectangle;

// Du kan nå bruke rektangelobjektet som vanlig

}

Kort og lang levetid svake referanser

Svake referanser kan enten være kortvarige eller langvarige. Den primære forskjellen mellom kort og svak referanse er at mens i det første tilfellet Target-egenskapen til den svake referansen blir null hvis GC gjenvinner objektet, i sistnevnte tilfelle er den lange svake referansen i live selv etter at GC har kjørt, dvs. overlever en GC-syklus. Merk at du bør bruke lange svake referanser med forsiktighet da tilstanden til objektet ikke kan forutsies etter ferdigstillelse.

I hovedsak bør du bruke korte svake referanser når du vil bruke et objekt som er i brukbar tilstand. Tvert imot, en lang svak referanse er et godt valg når du ønsker å bruke objektet uavhengig av dets tilstand. For å opprette en lang svak referanse, må du sende "true" som den andre parameteren til den overbelastede konstruktøren i WeakReference-klassen mens du oppretter den svake referansen. Følgende kodebit illustrerer dette.

Rektangelrektangel = nytt rektangel (15, 10);

var weakReference = ny WeakReference (rektangel, sant);

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