2009-09-17 6 views

Répondre

2

System.String (string en C#) est un type de référence, donc il n'y a aucune raison pour que cela ne fonctionne pas correctement avec WeakReference. Ignorez le fait qu'il s'agit en quelque sorte d'un type de référence spécial (immuable, pour commencer) - le CLR le voit comme un type de référence. En disant cela, this other StackOverflow thread fait un bon point que les références de chaîne peuvent être «internées» dans de nombreuses situations, et donc le comportement «attendu» en ce qui concerne la récupération de place n'est pas observé.

+0

C'était ma première pensée, mais est-ce vrai? Voir aussi cette question: http://stackoverflow.com/questions/208387/weakreference-bug – Razzie

+0

@Razzie: C'est juste une implication de la façon dont le GC fonctionne avec les chaînes de caractères. – Noldorin

1

Cela fonctionnera sans aucun doute avec WeakReference sans aucun problème car System.String est un type de référence simple. Il serait intéressant de voir votre cas d'utilisation d'un WeakReference car il ne semble pas correspondre aux utilisations "normales" de WeakReference.

De l'MSDN Guidelines:

Utiliser des références longues faibles que lorsque cela est nécessaire que 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 aussi grand ou plus grand. Évitez d'utiliser des références faibles comme solution automatique aux problèmes de gestion de la mémoire. Au lieu de cela, développez une stratégie de mise en cache efficace pour gérer les objets de votre application.

+0

Mon cas est que j'ai tellement de chaînes, normalement ils sont stockés dans DB et je veux seulement les libérer quand je suis à court de mémoire. En fait, une meilleure mise en cache serait préférable, mais je n'ai trouvé aucun moyen de libérer le cache lorsque la mémoire est faible. –

+0

Je m'attendrais à ce que le garbage collector fonctionne comme prévu et nettoie les références aux chaînes (à moins qu'elles ne soient internées) lorsque l'application s'exécute. Si vous ne les voyez pas, je suppose que vous tenez des références ou que les chaînes sont en cours d'internement. –

0

Il n'y a généralement pas grand intérêt à utiliser une référence faible pour désigner un objet profondément immuable, en particulier un objet qui ne fait référence à aucun autre objet. Si les données sont utiles, vous devriez avoir une référence forte. Si ce n'est pas utile, vous ne devriez pas avoir de référence. L'utilisation de WeakReference n'est vraiment appropriée que dans les cas où l'utilité de l'objet faiblement référencé dépend de l'existence d'une référence forte; le cas le plus courant est celui où une référence faible est utilisée pour placer des informations dans un objet qui sera lu via une référence forte. Si personne ne lit l'information mise dans l'objet, il n'y a plus aucune raison pour que l'écrivain s'en soucie.

Questions connexes