Quelqu'un peut-il expliquer les principaux avantages des différents types de références en C #?
Nous avons une application qui consomme beaucoup de mémoire et nous essayons de déterminer s'il s'agit d'un domaine sur lequel nous concentrer.
Les références molles et fantômes viennent de Java, je crois. Une longue référence faible (passe vrai au constructeur WeakReference de C #) pourrait être considérée comme similaire à PhantomReference de Java. S'il existe un analogue de SoftReference en C #, je ne sais pas ce que c'est.
Les références faibles ne prolongent pas la durée de vie d'un objet, ce qui lui permet d'être récupéré une fois que toutes les références fortes sont hors de portée. Ils peuvent être utiles pour conserver des objets volumineux qui sont coûteux à initialiser, mais devraient être disponibles pour la collecte des ordures s'ils ne sont pas activement utilisés.
Que cela soit utile ou non pour réduire la consommation de mémoire de votre application dépendra entièrement des spécificités de l'application. Par exemple, si vous disposez d'un nombre modéré d'objets mis en cache qui peuvent être réutilisés à l'avenir ou non, des références faibles pourraient aider à améliorer la consommation de mémoire des caches. Cependant, si l'application fonctionne avec un très grand nombre de petits objets, des références faibles aggraveront le problème car les objets de référence prendront autant ou plus de mémoire.
MSDN a une bonne explication de références faibles . La citation clé est en bas où elle dit:
Évitez d'utiliser des références faibles comme solution automatique à la mémoire problèmes de gestion . Au lieu de cela, développez une stratégie de mise en cache efficace pour gérer les objets de votre application.
Chaque fois que j'ai vu une référence faible dans la nature, elle a été utilisée comme solution automatique aux problèmes de gestion de la mémoire. Il existe probablement de meilleures solutions aux problèmes de votre application.
Un exemple réel brillant avec WeakReference est expliqué dans Tutoriel de développement Android .
Il y a une image (Bitmap) et un conteneur d'images sur la vue (ImageView). Si l'image sera chargée non pas de la mémoire (mais par exemple du disque, du net), elle peut verrouiller le thread d'interface utilisateur et l'écran. Pour l'éviter, une tâche asynchrone peut être utilisée.
Le problème se pose lorsque la tâche asynchrone se termine. Le conteneur d'images peut ne pas être utile du tout à ce moment-là (l'écran est changé ou Android décharge la partie de la vue invisible après le défilement). WeakReference peut aider ici et ImageView sera récupéré.
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
public BitmapWorkerTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Method for getting bitmap is removed for code clearness
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
P.S. l'exemple est en Java, mais peut être compris par les développeurs C #.
Source: http://developersdev.blogspot.ru/2014/01/weakreference-example.html