Weak references

Збирач сміття не може зібрати об'єкт, який використовується додатком, поки код додатка взаємодіє з цим об'єктом. Кажуть, що програма має строгу посилання на об'єкт.

Слабкі посилання корисні для об'єктів, які використовують великий обсяг пам'яті, але можуть бути створені повторно без особливих зусиль, якщо вони були видалені складальником сміття.

Припустимо, що в ієрархічному поданні додатки Windows Forms користувач бачить розгалужену ієрархічну структуру різних рішень. Якщо базові дані великі за обсягом, зберігання цього дерева в пам'яті є неефективним, особливо якщо користувач робить в цьому додатку що-небудь ще.

Якщо користувач перемикається в іншу частину програми, можна використовувати клас WeakReference для створення слабкої посилання на дерево і видалити всі строгі посилання. Коли користувач переключиться назад до цього дерева, додаток спробує отримати сувору посилання на дерево і, при успішному виконанні цієї операції, уникнути повторного створення дерева.

Щоб встановити слабку посилання на об'єкт, слід створити WeakReference. використовуючи примірника об'єкта, який необхідно відстежувати. Потім слід привласнити властивості Target цей об'єкт і встановити значення null для вихідної посилання на об'єкт. Приклад коду, див. Опис об'єкта WeakReference в бібліотеці класів.

Можна створити коротку слабку посилання або довгу слабку посилання:

Щоб встановити сувору посилання і повторно використовувати об'єкт, приведіть властивість Target об'єкта WeakReference до типу об'єкта. Якщо властивість Target повертає значення null. об'єкт був видалений збирачем; в іншому випадку можна продовжити використання об'єкта, так як додаток відновило сувору посилання на цей об'єкт.

Використовуйте довгі слабкі посилання тільки при необхідності, так як стан об'єкта після виконання завершення стає непередбачуваним.

Уникайте використання слабких посилань на невеликі об'єкти, тому що сам покажчик може бути таким же за обсягом або навіть більше.

Уникайте використання слабких посилань в якості автоматичного вирішення проблем, пов'язаних з управлінням пам'яттю. Замість цього розробіть ефективну політику кешування для обробки об'єктів програми.