Programmering

Mine to cent på svage referencer i .Net

GC er dygtig til at genvinde hukommelsen optaget af administrerede objekter. Du bør dog tage ekstra foranstaltninger for at lette affaldsindsamling for at forbedre dine applikations ydeevne.

En svag reference er en, der henviser til et objekt i hukommelsen, samtidig med at det gør det muligt for affaldssamleren at samle objektet eller genvinde den hukommelse, der er optaget af objektet, når GC kører. Et objekt, der kan nås, er ikke affald indsamlet af køretiden.

Du kan bruge svage referencer til objekter, der bruger meget hukommelse. Når du bruger svage referencer til sådanne objekter, aktiverer du disse objekter til at blive indsamlet skrald, samtidig med at de objekter kan genskabes senere, hvis det er nødvendigt. Så hvis du har et stort objekt i din applikation, som du ville bruge sjældnere, kan du bruge svag henvisning til sådanne objekter, forudsat at genskabelse af sådanne objekter ikke er så dyrt.

Bemærk, at når du opretter en svag reference til et objekt, lagres en IntPtr til en GCHandle internt af den svage reference, du har oprettet. Runtime bruger denne GCHandle til at styre en tabel, der indeholder svage referencer til objekter. Hvis et objekt allerede er indsamlet skrald, vil værdien af ​​IntPtr være IntPtr.Zero. Når den svage reference til objektet er afsluttet, fjernes den tilsvarende indtastning af den svage reference til objektet i den svage referencetabel. Hvis den svage reference til objektet stadig er i live, og du påberåber sig egenskaben Target på den svage reference, returneres det faktiske objekt, som GCHandle angiver for den svage reference.

Oprettelse af en svag reference til et objekt øger ikke objektets levetid. Det gør det muligt for affaldssamleren at genvinde den hukommelse, der er optaget af objektet, når der ikke findes stærke referencer til det objekt. Forskellen mellem en svag og en stærk henvisning til et objekt er, at mens førstnævnte stadig tillader affaldssamleren at genvinde den hukommelse, der er optaget af det objekt, tillader en stærk henvisning til et objekt ikke affaldssamleren at genvinde hukommelsen, der er optaget af objektet, hvis objektet kan nås.

Programmering af svag reference i C #

For at oprette en svag reference skal du drage fordel af klassen System.WeakReference. Når du først har oprettet en svag reference til et objekt, kan du bruge egenskaben Target for den svage reference, du har oprettet, til at kontrollere, om det oprindelige objekt stadig er i live. Følgende kodestykke viser, hvordan du kan oprette en svag reference til et objekt.

Rektangelrektangel = nyt rektangel (15, 10);

var weakReference = ny WeakReference (rektangel);

Du kan bruge IsAlive-egenskaben til at kontrollere, om den svage reference til objektet stadig er i live. Her er en kodeliste, der illustrerer dette.

statisk ugyldigt Main (streng [] args)

        {

Rektangelrektangel = nyt rektangel (15, 10);

var weakReference = ny WeakReference (rektangel);

rektangel = null;

bool isAlive = weakReference.IsAlive;

hvis (isAlive)

Console.WriteLine ("Objektet lever stadig");

Console.Read ();

        }

Hvis den stærke reference til objektet ikke længere er tilgængelig, kan du udnytte Target-egenskaben for den svage reference til at bruge objektet som vist i kodestykket nedenfor.

bool isAlive = weakReference.IsAlive;

hvis (isAlive)

{

Rektangelrektangel = weakReference.Target som Rectangle;

// Du kan nu bruge rektangelobjektet som normalt

}

Kort og længe levede svage referencer

Svage referencer kan enten være kortvarige eller langvarige. Den primære forskel mellem kort og svag reference er, at mens i det tidligere tilfælde målegenskaben for den svage reference bliver nul, hvis GC genvinder objektet, i sidstnævnte tilfælde er den lange svage reference i live, selv efter at GC kører, dvs. overlever en GC-cyklus. Bemærk, at du skal bruge lange svage referencer med forsigtighed, da objektets tilstand ikke kan forudsiges efter færdiggørelse.

I bund og grund skal du bruge korte svage referencer, når du gerne vil bruge et objekt, der er i en brugbar tilstand. Tværtimod er en lang svag reference et godt valg, når du gerne vil bruge objektet uanset dets tilstand. For at oprette en lang svag reference skal du sende "sand" som den anden parameter til den overbelastede konstruktør i WeakReference-klassen, mens du opretter den svage reference. Følgende kodestykke illustrerer dette.

Rektangelrektangel = nyt rektangel (15, 10);

var weakReference = ny WeakReference (rektangel, sand);

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