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

Сборщик мусора не может собрать объект, используемый приложением, пока код приложения взаимодействует с этим объектом.The garbage collector cannot collect an object in use by an application while the application's code can reach that object. Говорят, что приложение имеет строгую ссылку на объект.The application is said to have a strong reference to the object.

Слабая ссылка дает сборщику мусора возможность удалить объект, но в то же время обеспечивает приложению доступ к этому объекту.A weak reference permits the garbage collector to collect the object while still allowing the application to access the object. Слабая ссылка допустима только в течение неопределенного количества времени до сборки объекта при отсутствии строгих ссылок.A weak reference is valid only during the indeterminate amount of time until the object is collected when no strong references exist. При использовании слабой ссылки приложение все еще может получить строгую ссылку в объекте, что предотвратит удаление последнего.When you use a weak reference, the application can still obtain a strong reference to the object, which prevents it from being collected. Однако всегда существует вероятность удаления объекта сборщиком мусора до повторного создания строгой ссылки.However, there is always the risk that the garbage collector will get to the object first before a strong reference is reestablished.

Слабые ссылки полезны для объектов, которые используют большой объем памяти, но могут быть созданы повторно без особых усилий, если они были удалены сборщиком мусора.Weak references are useful for objects that use a lot of memory, but can be recreated easily if they are reclaimed by garbage collection.

Для примера рассмотрим представление в виде дерева в приложении Windows Forms, которое отображает для пользователя разветвленную иерархическую структуру нескольких вариантов.Suppose a tree view in a Windows Forms application displays a complex hierarchical choice of options to the user. Если базовые данные большие по объему, хранение этого дерева в памяти является неэффективным, особенно если пользователь делает в этом приложении что-либо еще.If the underlying data is large, keeping the tree in memory is inefficient when the user is involved with something else in the application.

Если пользователь переключается в другую часть приложения, можно использовать класс WeakReference для создания слабой ссылки на дерево и удалить все строгие ссылки.When the user switches away to another part of the application, you can use the WeakReference class to create a weak reference to the tree and destroy all strong references. Когда пользователь переключится обратно к этому дереву, приложение попытается получить строгую ссылку на дерево и, при успешном выполнении этой операции, избежать повторного создания дерева.When the user switches back to the tree, the application attempts to obtain a strong reference to the tree and, if successful, avoids reconstructing the tree.

Чтобы установить слабую ссылку на объект, создайте WeakReference, используя экземпляр объекта для отслеживания.To establish a weak reference with an object, you create a WeakReference using the instance of the object to be tracked. Затем следует присвоить свойству Target этот объект и задать значение null для исходной ссылки на объект.You then set the Target property to that object and set the original reference to the object to null. Пример кода см. в разделе WeakReference в библиотеке классов.For a code example, see WeakReference in the class library.

Краткие и длинные слабые ссылкиShort and Long Weak References

Можно создать краткую слабую ссылку или длинную слабую ссылку:You can create a short weak reference or a long weak reference:

  • ShortShort

    Назначением краткой ссылки становится null, если объект удален сборщиком мусора.The target of a short weak reference becomes null when the object is reclaimed by garbage collection. Сама по себе слабая ссылка является управляемым объектом и подлежит сборке мусора, как и любые другие управляемые объекты.The weak reference is itself a managed object, and is subject to garbage collection just like any other managed object. Краткая слабая ссылка является конструктором по умолчанию для WeakReference.A short weak reference is the default constructor for WeakReference.

  • LongLong

    Длинная слабая ссылка сохраняется после вызова метода Finalize объекта.A long weak reference is retained after the object's Finalize method has been called. Это позволяет повторно создавать объект, однако состояние объекта остается непредсказуемым.This allows the object to be recreated, but the state of the object remains unpredictable. Чтобы использовать длинную ссылку, укажите значение true в конструкторе WeakReference.To use a long reference, specify true in the WeakReference constructor.

    Если тип объекта не имеет метода Finalize, используется функция краткой слабой ссылки, а сама слабая ссылка становится допустимой только до сборки целевых объектов, что может произойти в любое время после запуска метода завершения.If the object's type does not have a Finalize method, the short weak reference functionality applies and the weak reference is valid only until the target is collected, which can occur anytime after the finalizer is run.

Чтобы установить строгую ссылку и повторно использовать объект, приведите свойство Target объекта WeakReference к типу этого объекта.To establish a strong reference and use the object again, cast the Target property of a WeakReference to the type of the object. Если свойство Target возвращает значение null, значит объект был удален сборщиком. В противном случае можно продолжить использование объекта, так как приложение восстановило строгую ссылку на этот объект.If the Target property returns null, the object was collected; otherwise, you can continue to use the object because the application has regained a strong reference to it.

Правила использования слабых ссылокGuidelines for Using Weak References

Используйте длинные слабые ссылки только при необходимости, так как состояние объекта после выполнения завершения становится непредсказуемым.Use long weak references only when necessary as the state of the object is unpredictable after finalization.

Избегайте использования слабых ссылок на небольшие объекты, потому что сам указатель может быть таким же по объему или даже больше.Avoid using weak references to small objects because the pointer itself may be as large or larger.

Избегайте использования слабых ссылок в качестве автоматического решения проблем, связанных с управлением памятью.Avoid using weak references as an automatic solution to memory management problems. Вместо этого разработайте эффективную политику кэширования для обработки объектов приложения.Instead, develop an effective caching policy for handling your application's objects.

См. такжеSee Also

Сборка мусораGarbage Collection