Слабые ссылки
Сборщик мусора не может собрать объект, используемый приложением, пока код приложения взаимодействует с этим объектом. Говориться, что приложение имеет строгую ссылку на объект.
Слабая ссылка дает сборщику мусора возможность удалить объект, но в то же время обеспечивает приложению доступ к этому объекту. Слабая ссылка допустима только в течение неопределенного количества времени до сборки объекта при отсутствии строгих ссылок. При использовании слабой ссылки приложение все еще может получить строгую ссылку в объекте, что предотвратит удаление последнего. Однако всегда существует вероятность удаления объекта сборщиком мусора до повторного создания строгой ссылки.
Слабые ссылки полезны для объектов, которые используют большой объем памяти, но могут быть созданы повторно без особых усилий, если они были удалены сборщиком мусора.
Предположим, что в иерархическом представлении приложения Windows Forms пользователь видит разветвленную иерархическую структуру различных решений. Если базовые данные большие по объему, хранение этого дерева в памяти является неэффективным, особенно если пользователь делает в этом приложении что-либо еще.
Если пользователь переключается в другую часть приложения, можно использовать класс WeakReference для создания слабой ссылки на дерево и удалить все строгие ссылки. Когда пользователь переключиться обратно к этому дереву, приложение попытается получить строгую ссылку на дерево и, при успешном выполнении этой операции, избежать повторного создания дерева.
Чтобы установить гибкую ссылку на объект, следует создать WeakReference с помощью экземпляра отслеживаемого объекта. Затем следует задать свойство Target, равным этому объекту, и задать для объекта значение null. Пример кода см. в описании объекта WeakReference в библиотеке классов.
Краткие и длинные слабые ссылки
Можно создать краткую слабую ссылку или длинную слабую ссылку:
Short
Назначением краткой ссылки становится null, если объект удален сборщиком мусора. Сама по себе слабая ссылка является управляемым объектом и подлежит сборке мусора, как и любые другие управляемые объекты. Краткая слабая ссылка является конструктором по умолчанию для WeakReference.
Long
Длинная слабая ссылка сохраняется после вызова метода Finalize объекта. Это позволяет повторно создавать объект, однако состояние объекта остается непредсказуемым. Чтобы использовать длинную ссылку, укажите значение true в конструкторе WeakReference.
Если тип объекта не имеет метода Finalize, используется функциональность краткой слабой ссылки, а сама слабая ссылка становится допустимой только до сборки цели, что может произойти в любое время после запуска метода завершения.
Чтобы установить строгую ссылку и повторно использовать объект, приведите свойство Target объекта WeakReference к типу объекта. Если свойство Target возвращает значение null, объект был собран; в противном случае можно продолжить использование объекта, так как приложение восстановило строгую ссылку на этот объект.
Правила использования слабых ссылок
Используйте длинные слабые ссылки только при необходимости, так как состояние объекта после выполнения завершения становится непредсказуемым.
Избегайте использования слабых ссылок на небольшие объекты, потому что сам указатель может быть таким же по объему или даже больше.
Избегайте использования слабых ссылок в качестве автоматического решения проблем, связанных с управлением памятью. Вместо этого разработайте эффективную политику кэширования для обработки объектов приложения.