Рассмотрите следующий код, первый показывает, что «очистка» выполняется, когда мы закончили итерацию над IEnumerable строк. Второй проход - это то, что вызывает у меня горе. Мне нужно отказаться от IEnumerable до достижения цели, а затем выполнить очистку кода. Но если вы запустите это, вы увидите, что во втором проходе очистка никогда не срабатывает.Как я могу отказаться от IEnumerator без итерации до конца?
Каков предпочтительный способ отказаться от IEnumerable, как это?
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");
}
Я может быть что-то отсутствует, или ваш пример чрезмерно упрощен ... но то, что очистка вы ней- запустить в конце Перечисления в readColors? Похоже, что GC должен иметь возможность обрабатывать вещи просто отлично. –
Если у вас есть пользовательская коллекция, вы также можете реализовать IDisposable?!. – serhio