Слабые ссылки

Сборщик мусора не может собрать объект, используемый приложением, пока код приложения взаимодействует с этим объектом. Говорят, что приложение имеет строгую ссылку на объект.

Слабая ссылка дает сборщику мусора возможность удалить объект, но в то же время обеспечивает приложению доступ к этому объекту. Слабая ссылка допустима только в течение неопределенного количества времени до сборки объекта при отсутствии строгих ссылок. При использовании слабой ссылки приложение все еще может получить строгую ссылку в объекте, что предотвратит удаление последнего. Однако всегда существует вероятность удаления объекта сборщиком мусора до повторного создания строгой ссылки.

Слабые ссылки полезны для объектов, которые используют большой объем памяти, но могут быть созданы повторно без особых усилий, если они были удалены сборщиком мусора.

Для примера рассмотрим представление в виде дерева в приложении Windows Forms, которое отображает для пользователя разветвленную иерархическую структуру нескольких вариантов. Если базовые данные большие по объему, хранение этого дерева в памяти является неэффективным, особенно если пользователь делает в этом приложении что-либо еще.

Если пользователь переключается в другую часть приложения, можно использовать класс WeakReference для создания слабой ссылки на дерево и удалить все строгие ссылки. Когда пользователь переключится обратно к этому дереву, приложение попытается получить строгую ссылку на дерево и, при успешном выполнении этой операции, избежать повторного создания дерева.

Чтобы установить слабую ссылку на объект, создайте WeakReference, используя экземпляр объекта для отслеживания. Пример кода см. в разделе WeakReference в библиотеке классов.

Краткие и длинные слабые ссылки

Можно создать краткую слабую ссылку или длинную слабую ссылку:

  • Короткие

    Назначением краткой ссылки становится null, если объект удален сборщиком мусора. Сама по себе слабая ссылка является управляемым объектом и подлежит сборке мусора, как и любые другие управляемые объекты. Краткая слабая ссылка является конструктором без параметров для WeakReference.

  • Long

    Длинная слабая ссылка сохраняется после вызова метода Finalize объекта. Это позволяет повторно создавать объект, однако состояние объекта остается непредсказуемым. Чтобы использовать длинную ссылку, укажите значение true в конструкторе WeakReference.

    Если тип объекта не имеет метода Finalize, используется функция краткой слабой ссылки, а сама слабая ссылка становится допустимой только до сборки целевых объектов, что может произойти в любое время после запуска метода завершения.

Чтобы установить строгую ссылку и повторно использовать объект, приведите свойство Target объекта WeakReference к типу этого объекта. Если свойство Target возвращает значение null, значит объект был удален сборщиком. В противном случае можно продолжить использование объекта, так как приложение восстановило строгую ссылку на этот объект.

Правила использования слабых ссылок

Используйте длинные слабые ссылки только при необходимости, так как состояние объекта после выполнения завершения становится непредсказуемым.

Избегайте использования слабых ссылок на небольшие объекты, потому что сам указатель может быть таким же по объему или даже больше.

Избегайте использования слабых ссылок в качестве автоматического решения проблем, связанных с управлением памятью. Вместо этого разработайте эффективную политику кэширования для обработки объектов приложения.

См. также