Si consideri il seguente codice, il primo dimostra che la "pulizia" viene eseguita quando abbiamo terminato l'iterazione su IEnumerable delle stringhe. Il secondo passaggio è ciò che mi sta causando dolore. Devo essere in grado di abbandonare l'oggetto IEnumerable prima di raggiungere la fine e quindi eseguire il codice di pulizia. Ma se lo fai, vedrai che nel secondo passaggio la pulizia non spara mai.Come posso abbandonare un IEnumerator senza iterare fino alla fine?
Qual è il modo preferito di abbandonare un IEnumerable come questo?
static void Main(string[] args)
{
// first pass
foreach (String color in readColors())
Console.WriteLine(color);
// second pass
IEnumerator<string> reader = readColors().GetEnumerator();
if (reader.MoveNext())
{
Console.WriteLine(reader.Current);
reader.Dispose();
}
}
static IEnumerable<string> readColors()
{
string[] colors = { "red", "green", "blue" };
for (int i = 0; i < colors.Length; i++)
yield return colors[i];
Console.WriteLine("Cleanup goes here");
}
I può essere manca qualcosa, o il vostro esempio è troppo semplificata ... ma cosa si fa a pulizia Ened a correre alla fine del censimento nel readColors? Sembra che il GC dovrebbe essere in grado di gestire le cose proprio bene. –
Se si dispone di una collezione personalizzata, è possibile implementare anche l'IDisposable?!. – serhio