Dire que j'ai une méthode comme celui-ci (volée à partir d'une précédente réponse SO par Jon Skeet):Collecte des ordures dans le rendement Méthodes
public static IEnumerable<TSource> DuplicatesBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
// Yield it if the key hasn't actually been added - i.e. it
// was already in the set
if (!seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
Dans cette méthode, j'ai un HashSet qui est utilisé pour les clés qui ont été vu. Si j'utilise cette méthode dans quelque chose comme ça.
List<string> strings = new List<string> { "1", "1", "2", "3" };
List<string> somewhatUniques = strings.DuplicatesBy(s => s).Take(2);
Ceci énumérera seulement les deux premiers éléments de la liste de chaînes. Mais comment le garbage collection collecte-t-il le hashset seenKeys? Étant donné que le rendement interrompt juste l'exécution de la méthode, si la méthode est coûteuse, comment puis-je m'assurer que je dispose des choses correctement?
Je n'arrive pas à croire que le cadre permette au hashset de s'asseoir jusqu'à ce que mon appdomain se ferme. Ce n'est pas que mon itérateur reste assis longtemps, c'est un exemple artificiel pour poser la question. –
Désolé, je n'ai pas été clair. Il ne le laisse pas s'asseoir pour toujours; il le laisse s'asseoir jusqu'à ce que l'enquêteur soit parti. – mquander