Références faibles

Le Garbage collector ne peut pas collecter un objet actuellement utilisé par une application, tandis que le code de l’application peut accéder à cet objet. On dit de l’application qu’elle a une référence forte à l’objet.

Une référence faible permet au Garbage collector de collecter l’objet tout en permettant à l’application d’y accéder. Une référence faible est valide uniquement pour une période indéterminée jusqu’à ce que l’objet soit collecté quand il n’existe aucune référence forte. Quand vous utilisez une référence faible, l’application peut toujours obtenir une référence forte à l’objet, ce qui l’empêche d’être collecté. Toutefois, il existe toujours un risque que le Garbage collector accède à l’objet avant qu’une référence forte soit rétablie.

Les références faibles sont utiles pour les objets qui utilisent beaucoup de mémoire, mais peuvent être recréées facilement si elles sont récupérées par le garbage collection.

Supposons que l’arborescence d’une application Windows Forms présente à l’utilisateur un choix hiérarchique d’options complexe. Si les données sous-jacentes sont volumineuses, la conservation de l’arborescence en mémoire est inefficace quand l’utilisateur est impliqué dans un autre élément de l’application.

Quand l’utilisateur passe à une autre partie de l’application, vous pouvez utiliser la classe WeakReference pour créer une référence faible à l’arborescence et détruire toutes les références fortes. Quand l’utilisateur revient à l’arborescence, l’application tente d’obtenir une référence forte à l’arborescence et, en cas de réussite, évite de reconstruire l’arborescence.

Pour établir une référence faible à un objet, vous créez un WeakReference à l’aide de l’instance de l’objet à suivre. Pour obtenir un exemple de code, consultez WeakReference dans la bibliothèque de classes.

Références faibles courtes et longues

Vous pouvez créer une référence faible courte ou une référence faible longue :

  • Court

    La cible d’une référence faible courte devient null quand l’objet est récupéré par le garbage collection. La référence faible est elle-même un objet managé et fait l’objet d’un garbage collection comme tout autre objet managé. Une référence faible courte est le constructeur sans paramètre pour WeakReference.

  • Long

    Une référence faible longue est conservée après l’appel de la méthode Finalize. Cela permet à l’objet d’être recréé, mais l’état de l’objet reste imprévisible. Pour utiliser une référence longue, spécifiez true dans le constructeur WeakReference.

    Si le type de l’objet ne dispose pas d’une méthode Finalize, la fonctionnalité de la référence faible courte s’applique et la référence faible est valide uniquement jusqu’à la collecte de la cible, ce qui peut se produire à tout moment après l’exécution du finaliseur.

Pour établir une référence forte et réutiliser l’objet, effectuez un cast de la propriété Target d’un WeakReference vers le type de l’objet. Si la propriété Target retourne la valeur null, l’objet a été collecté ; sinon, vous pouvez continuer à utiliser l’objet, car l’application a récupéré une référence forte à celui-ci.

Instructions d’utilisation de références faibles

Utilisez des références faibles longues uniquement quand cela est nécessaire, car l’état de l’objet est imprévisible après la finalisation.

Évitez d’utiliser des références faibles aux petits objets, car le pointeur lui-même peut être de la même taille ou d’une taille supérieure.

Évitez d’utiliser les références faibles comme solution automatique aux problèmes de gestion de la mémoire. Développez plutôt une stratégie de mise en cache efficace pour gérer les objets de votre application.

Voir aussi