Programavimas

Mano du centai už silpnas nuorodas .Net

GC moka susigrąžinti valdomų objektų užimamą atmintį. Tačiau turėtumėte imtis papildomų priemonių, kad palengvintumėte šiukšlių surinkimą, kad jūsų programos veiktų geriau.

Silpna nuoroda yra ta, kuri nurodo objektą atmintyje, tuo pačiu leidžiant šiukšlių surinkėjui surinkti objektą arba atgauti objekto užimamą atmintį, kai veikia GC. Prieinamas objektas nėra vykdymo metu surinktos šiukšlės.

Objektams, kurie sunaudoja daug atminties, galite naudoti silpnas nuorodas. Naudodami silpnas tokių objektų nuorodas, įgalinate tuos objektus surinkti šiukšles ir tuo pačiu leisti tuos objektus atkurti vėliau, jei to reikės. Taigi, jei jūsų programoje yra didelis objektas, kurį naudotumėte rečiau, galite naudoti silpną nuorodą į tokius objektus, jei tokių objektų atkūrimas nėra toks brangus.

Atminkite, kad kai sukuriate silpną nuorodą į objektą, „IntPtr“ į „GCHandle“ viduje saugo jūsų sukurta silpna nuoroda. Klaida naudoja šį GCHandle valdyti lentelę, kurioje yra silpnos nuorodos į objektus. Jei objektas jau buvo surinktas šiukšlių, IntPtr reikšmė bus IntPtr.Zero. Užbaigus silpną nuorodą į objektą, silpnos nuorodos į objektą atitinkamas silpnosios nuorodos lentelės įrašas pašalinamas. Jei silpna nuoroda į objektą vis dar yra gyva ir jūs iškviečiate savybę „Target“ silpnosios nuorodos atveju, grąžinamas tikrasis objektas, kurį nurodo silpnosios nuorodos GCHandle.

Sukūrus silpną nuorodą į objektą, objekto gyvenimo laikas nepadidėja. Tai leidžia šiukšlių surinkėjui susigrąžinti objekto užimtą atmintį, kai nėra stiprių nuorodų į tą objektą. Skirtumas tarp silpnos ir stiprios nuorodos į objektą yra tas, kad nors pirmasis leidžia šiukšlių surinkėjui susigrąžinti to objekto užimtą atmintį, tvirta nuoroda į objektą neleidžia šiukšlių surinkėjui atgauti užimtos atminties tas objektas, jei objektas yra pasiekiamas.

Programavimas silpnos nuorodos C #

Norėdami sukurti silpną nuorodą, turėtumėte pasinaudoti „System.WeakReference“ klase. Sukūrę silpną nuorodą į objektą, galite naudoti sukurtos silpnosios nuorodos ypatybę Tikslinė, kad patikrintumėte, ar originalus objektas vis dar gyvas. Šis kodo fragmentas parodo, kaip galite sukurti silpną nuorodą į objektą.

Stačiakampis stačiakampis = naujas stačiakampis (15, 10);

var silpnoji nuoroda = nauja silpnoji nuoroda (stačiakampis);

Norėdami patikrinti, ar silpna nuoroda į objektą vis dar gyva, galite naudoti ypatybę „IsAlive“. Tai iliustruojantis kodų sąrašas.

static void Main (string [] args)

        {

Stačiakampis stačiakampis = naujas stačiakampis (15, 10);

var silpnoji nuoroda = nauja silpnoji nuoroda (stačiakampis);

stačiakampis = nulis;

bool isAlive = silpna nuoroda.IsAlive;

jei (isAlive)

Console.WriteLine ("Objektas vis dar gyvas");

Pultas.Skaitykite ();

        }

Jei stiprios nuorodos į objektą nebėra, galite panaudoti silpnos nuorodos ypatybę Tikslinė, kad galėtumėte naudoti objektą, kaip parodyta toliau pateiktame kodo fragmente.

bool isAlive = silpna nuoroda.IsAlive;

jei (isAlive)

{

Stačiakampis stačiakampis = silpna nuoroda. Taikyti kaip stačiakampį;

// Dabar stačiakampio objektą galite naudoti kaip įprasta

}

Trumpos ir ilgai gyvenusios silpnos nuorodos

Silpnos nuorodos gali būti trumpalaikės arba ilgaamžės. Pagrindinis skirtumas tarp trumposios ir silpnosios nuorodos yra tas, kad jei pirmuoju atveju silpnosios nuorodos „Target“ ypatybė tampa niekinė, jei GC susigrąžina objektą, antruoju atveju ilgas silpnasis atskaitos taškas yra gyvas net po to, kai veikia GC, t. išgyvena GC ciklą. Atkreipkite dėmesį, kad turėtumėte atsargiai naudoti ilgas silpnas nuorodas, nes objekto būsenos negalima numatyti po užbaigimo.

Iš esmės turėtumėte naudoti trumpas silpnas nuorodas, kai norite naudoti objektą, kuris yra tinkamos naudoti būsenos. Priešingai, ilga silpna nuoroda yra geras pasirinkimas, kai norėtumėte naudoti objektą, neatsižvelgiant į jo būseną. Norėdami sukurti ilgą silpną nuorodą, turite perduoti „true“ kaip antrąjį parametrą perkrautam „WeakReference“ klasės konstruktoriui kurdami silpnąją nuorodą. Tai iliustruoja šis kodo fragmentas.

Stačiakampis stačiakampis = naujas stačiakampis (15, 10);

var silpnasReferencija = nauja WeakReferencija (stačiakampis, tiesa);

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