Ohjelmointi

Kaksi senttiäni heikoista viitteistä .Netissä

GC osaa palauttaa hallittujen objektien käyttämän muistin. Sinun on kuitenkin toteutettava lisätoimenpiteitä roskien keräyksen helpottamiseksi sovellusten suorituskyvyn parantamiseksi.

Heikko viite on viite, joka viittaa muistissa olevaan objektiin ja antaa samalla roskakorin kerätä objektin tai palauttaa objektin käyttämän muistin, kun GC toimii. Kohde, joka on tavoitettavissa, ei ole ajon aikana kerättyä roskaa.

Voit käyttää heikkoja viitteitä kohteille, jotka kuluttavat paljon muistia. Kun heikkoja viitteitä käytetään tällaisiin kohteisiin, voit sallia kyseisten objektien kerätä roskat samalla, kun sallit kyseisten objektien luoda uudelleen myöhemmin tarvittaessa. Joten jos sovelluksessasi on suuri esine, jota käyttäisit harvemmin, voit käyttää heikkoa viittausta tällaisiin kohteisiin edellyttäen, että tällaisten objektien luominen ei ole niin kallista.

Huomaa, että kun luot heikon viitteen objektille, luomasi heikko viite tallentaa IntPtr: n GCH-kädensijaan sisäisesti. Ajonaika käyttää tätä GCHandlea taulukon hallintaan, joka sisältää heikkoja viitteitä esineisiin. Jos esine on jo kerätty roskiin, IntPtr: n arvo on IntPtr.Zero. Kun heikko viittaus esineeseen on viimeistelty, vastaava heikon viittauksen kohteeseen viittaus heikkoon viitetaulukkoon poistetaan. Jos heikko viittaus objektiin on edelleen elossa ja vedot Target-ominaisuuden heikkoon viitteeseen, todellinen objekti, johon GCHandle osoittaa heikon viitteen, palautetaan.

Heikon viittauksen luominen esineeseen ei lisää objektin käyttöikää. Sen avulla roskien keräilijä voi palauttaa objektin käyttämän muistin, kun tälle esineelle ei ole vahvoja viitteitä. Ero heikon ja vahvan viittauksen esineeseen on, että vaikka edellinen sallii edelleen roskien keräilijän palauttaa kyseisen objektin käyttämän muistin, vahva viittaus esineeseen ei salli roskakorin keräävän muisti että esine on tavoitettavissa.

Heikon ohjearvon ohjelmointi C #: ssä

Jos haluat luoda heikon viitteen, sinun on hyödynnettävä System.WeakReference-luokkaa. Kun olet luonut heikon viitteen objektiin, voit käyttää luomasi heikon viitteen Target-ominaisuutta tarkistaaksesi, onko alkuperäinen objekti edelleen elossa. Seuraava koodinpätkä osoittaa, kuinka voit luoda heikon viitteen objektiin.

Suorakulmion suorakulmio = uusi suorakulmio (15, 10);

var heikentävä viite = uusi heikko viite (suorakulmio);

Voit käyttää IsAlive-ominaisuutta tarkistaaksesi, onko objektin heikko viittaus edelleen elossa. Tässä on koodiluettelo, joka kuvaa tätä.

staattinen void Main (merkkijono [] args)

        {

Suorakulmion suorakulmio = uusi suorakulmio (15, 10);

var silpuvaReference = uusi WeakReference (suorakulmio);

suorakulmio = nolla;

bool isAlive = heikkoReference.IsAlive;

jos (isAlive)

Console.WriteLine ("Kohde on edelleen elossa");

Konsoli.Lue ();

        }

Jos vahvaa viittausta objektiin ei ole enää saatavilla, voit käyttää heikon viitteen Target-ominaisuutta hyödyntämään objektia alla olevan koodinpätkän mukaisesti.

bool isAlive = heikkoReference.IsAlive;

jos (isAlive)

{

Suorakulmion suorakulmio = heikkoReference.Target as Rectangle;

// Voit nyt käyttää suorakulmio-objektia tavalliseen tapaan

}

Lyhyt ja pitkäikäinen heikko viite

Heikot viitteet voivat olla joko lyhytikäisiä tai pitkäikäisiä. Ensisijainen ero lyhyen ja heikon viitteen välillä on se, että kun ensimmäisessä tapauksessa heikon viitteen Target-ominaisuus muuttuu tyhjäksi, jos GC palauttaa objektin, jälkimmäisessä tapauksessa pitkä heikko viite on elossa myös sen jälkeen, kun GC käy, ts. selviää GC-syklistä. Huomaa, että sinun tulee käyttää pitkiä heikkoja viitteitä varoen, koska objektin tilaa ei voida ennustaa viimeistelyn jälkeen.

Pohjimmiltaan sinun tulisi käyttää lyhyitä heikkoja viitteitä, kun haluat käyttää objektia, joka on käyttökelpoisessa tilassa. Päinvastoin, pitkä heikko viite on hyvä valinta, kun haluat käyttää objektia sen tilasta riippumatta. Pitkän heikon viitteen luomiseksi sinun on välitettävä ”true” toisena parametrina WeakReference-luokan ylikuormitetulle rakentajalle samalla, kun luot heikon viitteen. Seuraava koodinpätkä kuvaa tätä.

Suorakulmion suorakulmio = uusi suorakulmio (15, 10);

var silpuvaReference = uusi WeakReference (suorakulmio, tosi);

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