Dela via


Svaga referenser

Skräpinsamlaren kan inte samla in ett objekt som används av ett program medan programmets kod kan nå objektet. Programmet sägs ha en stark referens till objektet.

En svag referens gör att skräpinsamlaren kan samla in objektet samtidigt som programmet kan komma åt objektet. En svag referens är endast giltig under den obestämda tiden tills objektet samlas in när det inte finns några starka referenser. När du använder en svag referens kan programmet fortfarande få en stark referens till objektet, vilket förhindrar att det samlas in. Det finns dock alltid en risk att skräpinsamlaren kommer till objektet först innan en stark referens återupprättas.

Svaga referenser är användbara för objekt som använder mycket minne, men som enkelt kan återskapas om de återvinns av skräpinsamling.

Anta att en trädvy i ett Windows Forms-program visar ett komplext hierarkiskt alternativ för användaren. Om underliggande data är stora är det ineffektivt att hålla trädet i minnet när användaren är involverad i något annat i programmet.

När användaren växlar bort till en annan del av programmet kan du använda WeakReference klassen för att skapa en svag referens till trädet och förstöra alla starka referenser. När användaren växlar tillbaka till trädet försöker programmet få en stark referens till trädet och undviker, om det lyckas, att rekonstruera trädet.

För att upprätta en svag referens med ett objekt skapar du en WeakReference med hjälp av den instans av objektet som ska spåras. Ett kodexempel finns WeakReference i klassbiblioteket.

Korta och långa svaga referenser

Du kan skapa en kort svag referens eller en lång svag referens:

  • Kort

    Målet för en kort svag referens blir null när objektet återvinns av skräpinsamling. Den svaga referensen är i sig ett hanterat objekt och omfattas av skräpinsamling precis som andra hanterade objekt. En kort svag referens är den parameterlösa konstruktorn för WeakReference.

  • Long

    En lång svag referens behålls efter att objektets -metod har anropats Finalize . Detta gör att objektet kan återskapas, men objektets tillstånd förblir oförutsägbart. Om du vill använda en lång referens anger du true i WeakReference konstruktorn.

    Om objektets typ inte har någon Finalize metod gäller den korta svaga referensfunktionen och den svaga referensen är endast giltig tills målet har samlats in, vilket kan inträffa när som helst efter att slutföraren har körts.

Om du vill upprätta en stark referens och använda objektet igen omvandlar du Target egenskapen för en WeakReference till objektets typ. Om egenskapen Target returnerar nullhar objektet samlats in. Annars kan du fortsätta att använda objektet eftersom programmet har återfått en stark referens till det.

Riktlinjer för att använda svaga referenser

Använd endast långa svaga referenser när det behövs eftersom objektets tillstånd är oförutsägbart efter slutförande.

Undvik att använda svaga referenser till små objekt eftersom själva pekaren kan vara lika stor eller större.

Undvik att använda svaga referenser som en automatisk lösning på minneshanteringsproblem. Utveckla i stället en effektiv cachelagringsprincip för hantering av programmets objekt.

Se även